我有这个 xml 文件
<Cdtr>
<Nm>DEF Electronics</Nm>
<PstlAdr>
<AdrLine>Corn Exchange 5th Floor</AdrLine>
<AdrLine>Mark Lane 55</AdrLine>
<AdrLine>EC3R7NE London</AdrLine>
<AdrLine>GB</AdrLine>
</PstlAdr>
</Cdtr>
我正在尝试使用Java中的dom解析器解析xml,获取叶标签名称(有值)及其各自的值。以下是我为此使用的代码。
public class GetNodeValues {
public static void main(String[] args) {
try {
String xmlFile = "C:/Users/Administrator/workspace/sample.xml";
File file = new File(xmlFile);
if(file.exists()){
// Create a factory
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// Use the factory to create a builder
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(xmlFile);
doc.getDocumentElement().normalize();
// Get a list of all elements in the document
NodeList list = doc.getElementsByTagName("*");
System.out.println("XML Elements: ");
for (int i=0; i<list.getLength(); i++) {
// Get element
Element element = (Element)list.item(i);
String nodnam = element.getNodeName();
NodeList nl = doc.getElementsByTagName(nodnam);
Element ele = (Element) nl.item(0);
if (ele.getChildNodes().getLength() > 0) // then it has text
String val = ele.getChildNodes().item(0).getNodeValue();
if (val.startsWith("\n")) { //Discarding pseudo nodes
}else {
System.out.println("Node: "+nodnam+" | Val: "+val); //print node names and values
}
}
}
}
else{
System.out.print("File not found!");
}
}
catch (Exception e) {
System.exit(1);
}
}
}
我得到以下结果。
Node: AdrLine | Val: Corn Exchange 5th Floor
Node: AdrLine | Val: Corn Exchange 5th Floor
Node: AdrLine | Val: Corn Exchange 5th Floor
Node: AdrLine | Val: Corn Exchange 5th Floor
请帮忙。我不明白为什么它重复标签值。预期输出是
Node: AdrLine | Val: Corn Exchange 5th Floor
Node: AdrLine | Val: Mark Lane 55
Node: AdrLine | Val: EC3R7NE London
Node: AdrLine | Val: GB
最佳答案
解析文档时,您使用Document.getElementsByTagName(String tagname)
。根据其 Javadoc,它按文档顺序返回文档中的所有Element
。由于您的结构具有多个 AddrLine
元素,并且由于您始终从此列表中选择第零个元素,因此它始终为您提供相同的元素。
相反,您可能想编写如下内容:
for (int i = 0; i < list.getLength(); i++) {
Element element = (Element) list.item(i);
String nodnam = element.getNodeName();
if (element.getChildNodes().getLength() > 0) // then it has text
{
// etc., etc.
总而言之,当您已经拥有可用的元素时,不要尝试从文档中检索该元素。
关于java - Java 的 DOM 解析器打印相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15812261/