【问题标题】:Read xml attributes at multiple levels from a `Document`从“文档”中读取多个级别的 xml 属性
【发布时间】:2013-10-15 22:46:36
【问题描述】:

我从教程中获得了以下代码,用于在 Java 应用程序中打印出 xml 属性。最终我会将它们作为字符串分配给变量。

        doc.getDocumentElement().normalize();
        System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
        NodeList nList = doc.getElementsByTagName("xyz:xyzcontent");
        System.out.println("----------------------------");

        for (int temp = 0; temp < nList.getLength(); temp++) {

            Node nNode = nList.item(temp);

            System.out.println("\nCurrent Element is " + nNode.getNodeName());

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) nNode;

                eElement.getAttribute("id");
                System.out.println("Link : " + eElement.getElementsByTagName("link").item(0).getTextContent());

            }
        }

这工作正常,但我需要访问特定的&lt;date&gt;。有多个&lt;date&gt; 属性。例如:

<releasedate>
   <date>1300981500000</date>
</releasedate>
<createddate>
   <date>1300981385795</date>
</createddate>

如何获取&lt;createddated&gt;&lt;date&gt; 值而不是&lt;releasedate&gt;&lt;date&gt; 值?似乎它只是选择了它找到的第一个。谢谢。

【问题讨论】:

    标签: java xml document


    【解决方案1】:

    我会使用 XPathExpression。

    代码如下所示:

    XPathFactory xfactory = XPathFactory.newInstance();
    XPath xpath = xfactory.newXPath();
    XPathExpression createdDateExpression = xpath.compile("/createddate/date"); //or actual path
    String createdDateStr = createdDateExpression.evaluate(doc);
    

    编译后,您可以在任何文档上使用表达式。

    我喜欢使用 XPath 从 XML 中提取几个元素,而不是将整个文档解析为一个对象。

    【讨论】:

    • 不幸的是,这并没有返回 createdDateStr 的任何结果。我正在使用 /xyz:xyzcontent/createddate/date 的完整路径。
    • 在此处阅读如何在 XPath 对象中注册命名空间(相当简单):illegalargumentexception.blogspot.com/2009/05/…
    • 这很有帮助,但对于我的第一个例子来说,这似乎是一个非常困难的例子。我要提交另一个问题。
    【解决方案2】:
    public static void main(String[] args) throws Throwable, SAXException, IOException {
    
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(your stream);
        NodeList n = doc.getElementsByTagName("root").item(0).getChildNodes();
        for(int i=0; i<n.getLength(); i++) {
            Node item = n.item(i);
            if(item instanceof Element) {
                String e = ((Element)item).getElementsByTagName("date").item(0).getTextContent();
                System.out.println();
                System.out.println(((Element) item).getTagName());
                System.out.println(e);
                //if you need to convert to date:
                System.out.println(new Date(Long.parseLong(e)));
            }
        }
    }
    

    你必须使用 for 来获取一个元素。您无法获得特定节点,如没有任何库的“root\releasedate\date”。 我的输出:

    releasedate
    1300981500000
    Thu Mar 24 16:45:00 CET 2011
    
    createddate
    1300981385795
    Thu Mar 24 16:43:05 CET 2011
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多