В настоящее время я сталкиваюсь с проблемой, что хочу передать координаты x и y из XML в Java, и я не уверен, как соединить отдельные пары координат (x и y) с точками и в каком виде массива я должен их хранить? Количество точек не предопределено, поэтому я думаю, что я должен использовать ArrayList ?. Кроме того, координаты также могут иногда быть целыми числами (не как в примере ниже). У меня вопрос, как включить чтение в массив непосредственно в синтаксический анализ файла XML. Ниже приведены некоторые первые фрагменты кода, которые я пробовал.
Файл XML выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><Room><ID>Test</ID><corners><corner><x>400.3</x><y>997.2</y></corner><corner><x>400.3</x><y>833.1</y></corner><corner><x>509.9</x><y>833.1</y></corner><corner><x>509.9</x><y>700.0</y></corner>...<corner><x>1012.1</x><y>500.8</y></corner><corner><x>1012.1</x><y>900.2</y></corner><corner><x>902.0</x><y>900.2</y></corner><corner><x>902.0</x><y>997.2</y></corner></corners></Room>
Мой класс XMLParser выглядит следующим образом:
package parser;
import data.Room;
import parser.exc.XMLTransfererException;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.filter.ElementFilter;
import org.jdom2.input.SAXBuilder;
import org.jdom2.input.sax.XMLReaders
import org.jdom2.util.IteratorIterable;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
public class XMLTransferer implements IXMLTransferer {
final String dtdName = "DataModel.dtd";
final String dtdPath = "../File_Processing_Component/Model";
final String dtdFilename = String.format("%s/%s", dtdPath, dtdName);
final String xmlDoctypeRootElementName ="Raum";
boolean isValid;
SAXBuilder builder = new SAXBuilder(XMLReaders.NONVALIDATING);
Document doc = builder.build(new File(xmlFilename));
doc.setDocType(new DocType(xmlDoctypeRootElementName, dtdFilename));
String xmlString = new XMLOutputter().outputString(doc);
SAXBuilder validationBuilder = new SAXBuilder(XMLReaders.DTDVALIDATING);
@Override
public Room readFromFile(String dtdPath)
throws XMLTransfererException {
try (doc = validationBuilder.build(new StringReader(xmlString));)
isValid = true;
} catch (JDOMException jdEx) {
// ...
isValid = false;
}
if (isValid)
try { IteratorIterable<Element> iter = root.getDescendants(new ElementFilter("corner"));
while (iter.hasNext()) {
Element elem = iter.next();
Element childX = elem.getChild("x");
array.getPoints().add(Double.parseDouble(childX.getText()));
Element childY = elem.getChild("y");
array.getPoints().add(Double.parseDouble(childY.getText()));
}
}
catch (IOException | JDOMException x) {
x.printStackTrace();
}
System.out.println(array);
}
}
Как вы можете подумать, это далеко не завершено, однако при поиске ответа я не могу найти способ, как правильно с этим справиться. Помощь очень ценится!