1

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

我正在尝试解析 xml,使用 Java 中的 dom 解析器获取叶标签名称(具有值)及其各自的值。以下是我为此使用的代码。

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
4

2 回答 2

2

在解析文档时,您使用Document.getElementsByTagName(String tagname). 根据其 Javadoc,它以文档顺序Element返回文档中的所有 s 。由于您的结构有多个元素,并且由于您总是从该列表中选择第零个元素,因此它总是为您提供相同的元素。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.

总而言之,当您已经拥有可用的元素时,不要尝试从文档中检索它。

于 2013-04-04T13:17:02.413 回答
0

这是重新编译的程序以打印 xml 文档中的所有元素

    public static void main(String[] args) {

    try {

        String xmlFile = "staff.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("*");

            for (int i = 0; i < list.getLength(); i++) {
                // Get element
                Element element = (Element) list.item(i);
                String nodnam = element.getNodeName();
                if (element.getChildNodes().getLength() > 0) {
                    String val = element.getChildNodes().item(0)
                            .getNodeValue();
                    if (!val.startsWith("\n"))
                        System.out.println(nodnam + "==" + val);
                }
            }
        } else {
            System.out.print("File not found!");
        }
    } catch (Exception e) {
        System.exit(1);
    }
}

你去吧。它打印文件中的所有元素。

于 2014-10-13T11:25:01.610 回答