XML节点列表作为JavaFX可观察列表?

时间:2016-10-24 20:17:01

标签: java xml parsing javafx observablelist

遇到了问题...

我有一些带有根元素的XML文件,3个具有相同名称和不同属性的元素,并且每个元素都有一些元素。

我想在FX可观察列表中使用名为“id”的元素属性。 不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

由于你没有给我很多信息,我必须用一些虚拟代码来解释它。
所以我们假设你有这个XML:

<root id="0">
    <sub1 id="1">
        <hell1>hell1</hell1>
    </sub1>
    <sub2>
        <hell2 id="2">hell2</hell2>
    </sub2>
    <sub3>sub3</sub3>
</root>

请注意,“id” - 属性位于不同的元素级别,正如您所说。

从这里我还建议你使用像Heri一样的xpath。 从XML获取具有“id”-attributes的所有元素的最简单的xpath是:

//*[@id]

如果你不知道如何使用Java中的XML和Xpath,你可以在这里查找:
How to read XML using XPath in Java
Which is the best library for XML parsing in java

如果我想从我的XML获取所有“id” - 属性值,它将如下所示:

// My Test-XML
final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
        "<root id=\"0\">\n" +
        "\t<sub1 id=\"1\">\n" +
        "\t\t<hell1>hell1</hell1>\n" +
        "\t</sub1>\n" +
        "\t<sub2>\n" +
        "\t\t<hell2 id=\"2\">hell2</hell2>\n" +
        "\t</sub2>\n" +
        "\t<sub3>sub3</sub3>\n" +
        "</root>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// Here you have to put your XML-Source (String, InputStream, File)
        Document doc = builder.parse(new InputSource(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))));
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
// The xpath from above
XPathExpression expr = xpath.compile("//*[@id]");
// Here you get the node-list of all elements with an attribute named "id"
NodeList nodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nodeList.getLength(); i++) {
    // run through all nodes
    Node node = nodeList.item(i);
    // fetch the values from the "id"-attribute
    final String idValue = node.getAttributes().getNamedItem("id").getNodeValue();
    // Do something awesome!!! 
    System.out.println(idValue);
}

我假设您知道如何将值放入您的可观察列表中。 :)
如果您还有其他问题,请随时提出。

PS:如果你向我展示你的XML,我可以更有效地帮助你。