java - Java 的 DOM 解析器打印相同的值

标签 java xml dom

我有这个 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/

相关文章:

java - org.hibernate.hql.internal.ast.QuerySyntaxException : unexpected token: >= near line 1

java - 如何将对象转换为 Map 样式 JSON 以通过 Spring 中的 Get 请求发送?

xml - 如何从 xml 获取节点而不知道其在 flex 中的级别?

java - 是否可以禁用 spring batch 的跳过限制?

javascript - 向 DOM 添加新元素时遇到问题?

javascript - BOOTSTRAP 工具提示多实例不起作用

Java Zip 文件自定义名称

java - Spring cloud stream kafka binder 是否有一个很好的例子来使用通用的 json 消息

java - Restful 中返回类型 xml 或 json

php - 如何从网站收集图像,包括 CSS 文件中引用的任何图像?