gpt4 book ai didi

java - 如何在java中获取嵌套XML中的父标签?

转载 作者:行者123 更新时间:2023-12-02 11:43:06 25 4
gpt4 key购买 nike

我有一个如下所示的 XML 文件:

  <main>
<member>
<tag1>
<id>"123"</id>
</tag1>
</member>
<member>
<tag1>
<id>"222"</id>
<first>
<code>"1"</code>
<name>"x"<name>
</first>
</tag1>
</member>
<member>
<tag1>
<id>"321"</id>
</tag1>
</member>
<member>
<tag1>
<id>"333"</id>
<second>
<code>"1"</code>
<name>"y"<name>
</second>
<first>
<code>"2"</code>
<name>"z"<name>
</first>
</tag1>
</member>
</main>

我能够循环列表并获取列表中的“名称”值。我应该在 CSV 文件中打印结果,其中包含“名字”和“名字”等列,因此在读取这些名称时,我需要知道哪个名称与哪个“父”标签关联。换句话说,我需要在“名字”列中的标签“First”下插入名称,在“第二个名称”下的“第二个”标签下插入名称。因此,在我循环时,我应该检查父级是否是“第一个”,将名称插入“名字”等。 我的元素名称如下:

  NodeList nameList=doc.getElementsByTagName("tag1");
...//some code to parse throught the rest of the elements
for (int temp = 0; temp < nameList.getLength(); temp++) {
Node nNode = nameList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE){
Element nElement=(Element) nNode;
System.out.println(nElement.getElementsByTagName("name").item(temp).getTextContent());
}
}

如果我使用以下内容进行检查,它将给我“member1”。

  nElement.getParentNode().getNodeName()

如何获得“first”或“second”作为“name”的 parent ?或者有更好的方法来做到这一点吗?

注意:上面的代码是我的代码的一部分,它非常大,因为这个 XML 中有很多标签需要解析。我刚刚添加了信息所需的部分代码。如果需要更多信息,请告诉我,以便我更新我的问题。

我使用XPath解决了这个问题,但仍然没有得到答案:

        String expression="/main/member";
String fExpression="/main/member/tag1/first";
String sExpression="/main/member/tag1/second";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);


for (int i=0; i<nodeList.getLength();i++){
Node nNode=nodeList.item(i);
NodeList pLangList = (NodeList) xPath.compile(fExpression).evaluate(nNode, XPathConstants.NODESET);
NodeList sLangList = (NodeList) xPath.compile(sExpression).evaluate(nNode, XPathConstants.NODESET);
Node flangNode=pLangList.item(i);
Node slangNode=sLangList.item(i);
if (flangNode.getNodeType() == Node.ELEMENT_NODE){
Element fLangElement=(Element) plangNode;
System.out.println(i+"# primary"+fLangElement.getElementsByTagName("name").item(0).getTextContent());
}
if (slangNode.getNodeType() == Node.ELEMENT_NODE){
Element sLangElement=(Element) slangNode;
System.out.println(i+"# secondary"+sLangElement.getElementsByTagName("name").item(0).getTextContent());
}
//rest of the code
}

我使用了 XPath,但问题是:在从 0 到列表长度的循环中,在迭代 0 中它打印 x 和 y,然后在迭代 1 中打印 z。它应该在迭代 1 上打印 x,在迭代 2 上打印 y、z!我该如何解决这个问题?

注意:我已使用最近的更改更新了代码,但仍然存在相同的问题以及如下错误:

0# first x
0# second y
1# first z

最佳答案

您可以使用xpath直接寻址所需的元素(java代码部分都是您的;))

获取“成员”标签并迭代它们

String expression = "//member"";
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);

然后对于每个节点,获取引用当前节点的其他标签

String namex = "//tag1/name/text()";
NodeList namenodeList = (NodeList) xPath.compile(namex).evaluate(nNode, XPathConstants.NODESET);

请注意,evaluate() 的第一个参数是当前的“node”而不是“doc”。

关于java - 如何在java中获取嵌套XML中的父标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48391576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com