如果Java中的另一个标记中存在同名的其他标记,如何提取XML文件中的特定标记内容?
目前,我正在使用DOM在Java中解析XML文件。但我遇到了一个问题,即如果在另一个标记中有其他具有相同名称的标记,如何从XML文件中提取特定的标记内容,如以下场景所示:如果Java中的另一个标记中存在同名的其他标记,如何提取XML文件中的特定标记内容?,java,parsing,xml-parsing,Java,Parsing,Xml Parsing,目前,我正在使用DOM在Java中解析XML文件。但我遇到了一个问题,即如果在另一个标记中有其他具有相同名称的标记,如何从XML文件中提取特定的标记内容,如以下场景所示: <file> <sub-file> <a> ....</a> <b> ....</b> <c> ....</c> </sub-file> <
<file>
<sub-file>
<a> ....</a>
<b> ....</b>
<c> ....</c>
</sub-file>
<a> ..... some data here ....</a>
<b> ..... some data here ....</b>
<c> ..... some data here ....</c>
<image>
<a> ....</a>
<b> ....</b>
<c> ....</c>
</image>
</file>
那么,如何提取不在另一个子文件或图像中的a、b、c标记呢?到目前为止,我尝试了以下代码:
File xmlfile=new File(path);
factory = DocumentBuilderFactory.newInstance();
builder= factory.newDocumentBuilder();
document= builder.parse(xmlfile);
document.getDocumentElement().normalize();
filelist= document.getElementsByTagName("file");
for(int o=0;o<filelist.getLength();o++)
{
Node nNode = filelist.item(o);
if (nNode.getNodeType() == Node.ELEMENT_NODE)
{
Element element = (Element) nNode;
for (int a=0; a<element.getElementsByTagName("file").getLength(); a++)
{
tagA=element.getElementsByTagName("a").item(a).getTextContent();
tagB=element.getElementsByTagName("b").item(a).getTextContent();
tagC=element.getElementsByTagName("c").item(a).getTextContent();
}
}
}// loop
}
此代码在文件、子文件和图像中打印所有标记a、b、c三次。不要使用getElementsByTagName。而是自己导航DOM树:
Node fileNode = filelist.item(o);
for (Node child = fileNode.getFirstChild(); child != null; child = child.getNextSibling()) {
if (child.getNodeType() == Node.ELEMENT_NODE) {
switch (child.getNodeName()) {
case "a":
tagA = child.getTextContent();
break;
case "b":
tagB = child.getTextContent();
break;
case "c":
tagC = child.getTextContent();
break;
default:
// ignore
}
}
}
另外,您还可以研究使用XPath:
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
tagA = xpath.evaluate("a", fileNode);
tagB = xpath.evaluate("b", fileNode);
tagC = xpath.evaluate("c", fileNode);
Element.getElementsByTagNameString返回具有提供的标记名的所有子代节点,而不仅仅是直接子代。您可以通过使用getChildNodes并在返回的NodeList上迭代,或者使用getFirstChild并使用getNextSibling进行迭代来导航树
如果您不仅限于使用DOM,还可以使用XPath来选择适当的节点,即//file/a.很酷,我不认为用这种方式来查找标记的子节点。谢谢,这很有帮助。很好的解释,谢谢。我将搜索有关XPath解析的更多信息。