更新 我专门针对某个根节点下的员工,而不是整个文档中的所有“员工”元素。我忘了在这个问题中提到这个重要的细节。对不起大家。
我找到了这个问题的答案:
getElementsByTagName
但是有了这些数据:
<one>
<two>
<three>
<company>
<staff id="1001">
<firstname>Golf</firstname>
<lastname>4</lastname>
<nickname>Schnecke</nickname>
<salary>1</salary>
</staff>
<staff id="2001">
<firstname>Audi</firstname>
<lastname>R8</lastname>
<nickname>Rennaudi</nickname>
<salary>1111111</salary>
</staff>
<staff id="2002">
<firstname>Skoda</firstname>
<lastname>xyz</lastname>
<nickname>xyz</nickname>
<salary>0.1</salary>
</staff>
</company>
</three>
</two>
</one>
和这段代码:
public static void parseXML2() {
File fXmlFile = new File("src\\main\\java\\staff.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = null;
try {
dBuilder = dbFactory.newDocumentBuilder();
} catch (ParserConfigurationException ex) {
Logger.getLogger(MyParser.class.getName()).log(Level.SEVERE, null, ex);
}
Document doc = null;
try {
doc = dBuilder.parse(fXmlFile);
} catch (SAXException ex) {
Logger.getLogger(MyParser.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(MyParser.class.getName()).log(Level.SEVERE, null, ex);
}
System.out.println("test");
System.out.println(doc.getElementsByTagName("company").item(0).getTextContent());
}
我不仅仅得到一个职员要素,而是全部。怎么样? 我期待得到:
Golf
4
Schnecke
1
但我得到了这个:
Golf
4
Schnecke
1
Audi
R8
Rennaudi
1111111
Skoda
xyz
xyz
0.1
看起来您的帖子主要是代码,请添加更多详细信息...是的,详情就在那里。
答案 0 :(得分:0)
您有一行代码可以从第一家公司获取文本内容。
System.out.println(doc.getElementsByTagName("company").item(0).getTextContent());
这将获取第一个公司节点中的所有文本内容,在本例中是3个staff元素中的数据。如果要选择第一个staff元素,可以按名称选择,也可以通过获取公司的第一个子元素。
答案 1 :(得分:0)
你快到了。如果要获取第一个staff
节点的文本内容,请通过 标记名称获取元素:
System.out.println(doc.getElementsByTagName("staff").item(0).getTextContent());
// ^^^^^^
如果您想要获取staff
下的第一个company
节点,那么您可以通过节点类型和节点名称检查找到它们。这是一个基本的循环:
Node companyNode = doc.getElementsByTagName("company").item(0);
NodeList companyChildNodes = companyNode.getChildNodes();
for (int i = 0; i < companyChildNodes.getLength(); i++) {
Node node = companyChildNodes.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE && Objects.equals("staff", node.getNodeName())) {
System.out.println(node.getTextContent());
break;
}
}
您可能希望将for
循环重构为单独的方法。
您也可以使用XPATH。我认为它更简洁:
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("//company/staff[1]");
NodeList nl = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
System.out.println(nl.item(0).getTextContent());
说明:
//company
选择所有公司代码,无论它们在xml中的位置如何。 //
忽略了xml结构的其余部分。//company/staff
选择staff
标记下的所有company
代码。[0]
选择第一个此类项目。答案 2 :(得分:0)
如果您的xml具有您提到的格式,并且使用此行代码,
System.out.println(doc.getElementsByTagName("company").item(0).getTextContent();
您正在打印COMPANY标签名称下的所有内容,因此它将在公司中打印一切,如果您想选择仅打印第一名员工,请将sysout中的标记名更改为&#34;人员&#34;和项目变量为(0,1,2,3 - &gt;希望员工的索引)
System.out.println(doc.getElementsByTagName("staff").item(0).getTextContent();
我没有尝试过这个,但我认为它会起作用