当前,我正在使用DOM解析Java中的XML文件。但是,如果遇到以下情况,如果另一个标签中存在其他具有相同名称的标签,那么我将面临如何从XML文件提取特定标签内容的问题:
<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的所有标签打印3次(在文件,子文件和图像中)。
答案 0 :(得分:1)
请勿使用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);
答案 1 :(得分:0)
Element.getElementsByTagName(String)
返回具有提供的标签名称的所有 descendant 节点,而不仅仅是直接子节点。您可以使用getChildNodes()
并在返回的NodeList
上进行迭代,或使用getFirstChild()
并使用getNextSibling()
进行迭代来导航树。
如果您不仅限于使用DOM,还可以使用XPath选择适当的节点,即//file/a
。