【问题标题】:Parsing advanced XML in java [closed]在java中解析高级XML [关闭]
【发布时间】:2014-02-20 19:04:26
【问题描述】:

您好,我想解析看起来像这样的非常奇怪的 xml:

<foo>
    <foo1>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
    </foo1>
</foo>

<foo>
    <foo1>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
        <foo2></foo2>
    </foo1>
</foo>

当我使用本教程时,我无法从 foo2 获取值:

http://javarevisited.blogspot.com/2011/12/parse-xml-file-in-java-example-tutorial.html

但如果我们有像foo2这样的相同参数,它就不起作用

【问题讨论】:

  • 你应该谷歌Jaxb,或者点击here教程,记住,不要试图发明轮子
  • 这个问题似乎离题了,因为它缺乏足够的信息来诊断问题。更详细地描述您的问题或在问题本身中包含minimal example
  • 你也许应该告诉我们你要解析这个。给list?到String?到String[]?到你自己的数据结构?
  • 这不是有效的 XML。在任何标准 Web 浏览器中打开以了解原因。

标签: java xml


【解决方案1】:

那是因为你必须有一个父项来容纳所有其他元素,如下例所示:

<parentFoo>
    <foo>
        <foo1>
           <foo2></foo2>
           <foo2></foo2>
           <foo2></foo2>
           <foo2></foo2>
           <foo2></foo2>
        </foo1>
    </foo>

    <foo>
        <foo1>
           <foo2></foo2>
           <foo2></foo2>
           <foo2></foo2>
           <foo2></foo2>
           <foo2></foo2>
        </foo1>
    </foo>
</parentFoo>

【讨论】:

    【解决方案2】:

    //规范化您的 XML,然后通过该 XML 创建一个Document,然后按照以下代码进行操作

    NodeList nList = doc.getElementsByTagName("foo");
            for (int temp = 0; temp < nList.getLength(); temp++) { // loop for foo
                Node nodeTable = nList.item(temp);
                Element xmlFoo = (Element) nodeTable;
                if (nodeTable.getNodeType() == Node.ELEMENT_NODE) {
                NodeList nodeListFoo1 = xmlFoo.getElementsByTagName("foo1");
                for (int i = 0; i < nodeListFoo1.getLength(); i++) { // loop for foo1
                    Node nodefoo2 = nodeListFoo1.item(i);
                    Element elementfoo1 = (Element) nodefoo2;
                    // Collect foo2 
                    NodeList nodeListfoo2Name = elementfoo1.getElementsByTagName("foo2");
                    for (int j = 0; j < nodeListfoo2Name.getLength(); j++) { //// loop for foo2
                        Node nodefoo2Name = nodeListfoo2Name.item(j);
                        Element elementfoo2Name = (Element) nodefoo2Name;
                        //TODO: write code here, what you want to collect from foo2
                        }
                    }
                }
            }
    

    【讨论】:

      【解决方案3】:

      我建议使用jdom2。这是一个免费的图书馆,应该可以毫无困难地完成这项工作。

      首先,您将 XML 字符串解析为 Document。该文档代表您的完整 xml。

          SAXBuilder reader = new SAXBuilder();
          Document doc = null;
          try
          {
              doc = reader.build(new File("Path to XML")); //also string is possible
          }
          catch (JDOMException | IOException e)
          {
              e.printStackTrace();
          }
      

      在此之后,您可以遍历它的每个 Childs。那将是外部的。如果您不知道 childdepth 有多少,您可以随时检查childCount != 0 是否还有一个。也许为此创建一个递归方法。

      for (Element e : doc.getRootElement().getChildren())
          {
               // do something with the childs here for example
               e.getText(); //would be "" in your case
               for(Element child : e.getChildren()){
                   //do something with the child child
               }
          }
      

      等等。您可以从 Elements 中获取每个 attributegetName() 等。

      Here is one more Tutorial for the DOM parser.

      【讨论】:

        【解决方案4】:

        我同意 JAXB 是要走的路。为您的 xml 使用在线 XSD 生成器。使用该 XSD 并使用 Netbeans 提供的 JAX-B 绑定来创建 Java 类。

        然后您可以使用标准 JAX-B API 来编组和解组。

        【讨论】:

        • 为什么是-1?这是一个完全合理的答案?
        猜你喜欢
        • 2011-05-14
        • 1970-01-01
        • 1970-01-01
        • 2011-07-25
        • 2010-11-04
        • 1970-01-01
        • 2010-09-27
        • 2011-06-29
        • 1970-01-01
        相关资源
        最近更新 更多