如何将XML文件中的x和y坐标解析为Java中的Point2D数组?

如何将XML文件中的x和y坐标解析为Java中的Point2D数组?,java,xml,double,coordinates,Java,Xml,Double,Coordinates,我目前面临的问题是,我想将XML中的x和y坐标输入Java,但我不确定如何将各个坐标对(x和y)连接到点,以及应该以何种形式存储它们?点数不是预定义的,所以我想我应该使用ArrayList?。此外,坐标有时也可以是整数(与下面的示例不同)。我的问题是如何将对数组的读取直接包含到XML文件的解析中。下面是我第一次尝试的一些代码片段 XML文件如下所示: <?xml version="1.0" encoding="UTF-8" standalone="no"?><Room>&

我目前面临的问题是,我想将XML中的x和y坐标输入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>
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);
}
}
Test400.3997.2400.3833.1509.9833.1509.9700.0…1012.1500.81012.1900.2902.0900.2902.0997.2
我的XMLParser类如下所示:

<?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>
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);
}
}
包解析器;
导入数据室;
导入parser.exc.XMLTransferException;
导入org.jdom2.Document;
导入org.jdom2.Element;
导入org.jdom2.JDOMException;
导入org.jdom2.filter.ElementFilter;
导入org.jdom2.input.SAXBuilder;
导入org.jdom2.input.sax.XMLReaders
导入org.jdom2.util.IteratorIterable;
导入java.io.IOException;
导入java.nio.file.Path;
导入java.nio.file.path;
公共类XmlTransfer实现了IXMLTransfer{
最后一个字符串dtdName=“DataModel.dtd”;
最终字符串dtdPath=“../File\u Processing\u Component/Model”;
最终字符串dtdFilename=String.format(“%s/%s”,dtdPath,dtdName);
最后一个字符串xmlDoctypeRootElementName=“Raum”;
布尔值是有效的;
SAXBuilder=新的SAXBuilder(XMLReaders.NONVALIDATING);
Document doc=builder.build(新文件(xmlFilename));
doc.setDocType(新DocType(xmlDoctypeRootElementName,dtdFilename));
String xmlString=new XMLOutputter().outputString(doc);
SAXBuilder validationBuilder=新SAXBuilder(XMLReaders.DTDVALIDATING);
@凌驾
公共房间readFromFile(字符串dtdPath)
抛出XML异常{
try(doc=validationBuilder.build(newstringreader(xmlString));)
isValid=true;
}捕获(JDOMException jdEx){
// ...
isValid=false;
}
如果(有效)
尝试{iteratoriterableiter=root.getsubstands(newelementfilter(“corner”));
while(iter.hasNext()){
元素elem=iter.next();
元素childX=elem.getChild(“x”);
add(Double.parseDouble(childX.getText());
元素childY=elem.getChild(“y”);
add(Double.parseDouble(childY.getText());
}
}
catch(IOException | jdomeexception x){
x、 printStackTrace();
}
System.out.println(数组);
}
}

正如你所认为的,这远远超出了完整性,然而,在寻找答案时,我找不到一种方法来正确地管理它。非常感谢您的帮助

尝试以下解决方案

声明二维数组列表,如下所示

List<List<Double>> listCoordinate = new ArrayList<List<Double>>();

非常感谢。我以前不必设置列表的大小?另一个问题:你怎么看待对象Point2D,这不是一个好的选择吗?它不是必需的。如果这对你有效,请接受答案:)。谢谢