【问题标题】:XML Searching and ParsingXML 搜索和解析
【发布时间】:2011-02-07 17:57:23
【问题描述】:

我有一个尝试使用 Java 搜索的 XML 文件。我只需要通过标签名称找到一个元素,然后找到该标签的值。比如:

我有这个 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="https://company.com/test/xslt/processing_report.xslt"?>
<Certificate xmlns="urn:us:net:exchangenetwork:Company">
  <Value1>Veggie</Value1>
  <Value2>Fruits</Value2>
    <type1>Apple</type1>
       <FindME>Red</FindME>
  <Value3>Bread</Value3>
</Certificate>

我想在 FindME 标签中找到值。我不能使用 XPath,因为不同的文件可以有不同的结构,但它们总是有一个 FindME 标记。最后我正在寻找最简单的代码,我不太关心性能。谢谢

【问题讨论】:

    标签: java xml parsing


    【解决方案1】:

    代码如下:

        XPathFactory f = XPathFactory.newInstance();
        XPathExpression expr = f.newXPath().compile(
                "//*[local-name() = 'FindME']/text()");
        DocumentBuilderFactory domFactory = DocumentBuilderFactory
                .newInstance();
        domFactory.setNamespaceAware(true);
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse("src/test.xml"); //your XML file
    
        Object result = expr.evaluate(doc, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        System.out.println(nodes.getLength());
        for (int i = 0; i < nodes.getLength(); i++) {
            System.out.println(nodes.item(i).getNodeValue());
        }
    

    解释:

    //* - 匹配任何元素节点 - 无论它们在哪里

    local-name() = 'FindME' - 其中本地名称 - 即;不是完整路径 - 匹配“FindME”

    text() - 获取节点值。

    【讨论】:

      【解决方案2】:

      我认为您需要阅读 XPath,因为它可以很容易地解决这个问题。因此可以在 DOM API 中使用 getElementsByTagName。

      【讨论】:

        【解决方案3】:

        您仍然可以使用 XPath。您需要做的就是使用 //FindMe (read here on // usage) 表达式。这会从 xml 中的任何位置找到“FindMe”元素,无论其父级或根路径如何。

        如果您使用命名空间,请确保您让解析器意识到这一点

        【讨论】:

        • 你能给我举个例子吗?我尝试过各种解析器。
        • oooh.. 我认为命名空间可能是问题所在。如何让解析器意识到这一点?
        • //*[local-name() = 'FindMe'] 不会考虑命名空间
        • 此表达式将获取本地名称等于 'FindMe' (w3.org/TR/xpath/#function-local-name) 的所有节点
        【解决方案4】:
        String findMeVal = null;
        
        InputStream is = //...
        XmlPullParser parser = //...
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
        parser.setInput(is, null);
        
        int event;
        while (XmlPullParser.END_DOCUMENT != (event = parser.next())) {
            if (event == XmlPullParser.START_TAG) {
                if ("FindME".equals(parser.getName())) {
                    findMeVal = parser.nextText();
                    break;
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多