XML搜索和解析

时间:2011-02-07 17:57:23

标签: java xml parsing

我有一个XML文件,我试图使用Java进行搜索。我只需要通过其Tag名称找到一个元素,然后找到Tag的值。例如:

我有这个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标记。最后,我正在寻找最简单的代码,我不太关心性能。谢谢

4 个答案:

答案 0 :(得分:2)

以下是代码:

    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() - 获取节点值。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您仍然可以使用XPath。您需要做的就是使用 // FindMe read here on // usage)表达式。这会从xml中的任何位置找到“FindMe”元素,而不管其父节点或根节点。

如果您正在使用名称空间,请确保您使解析器知道

答案 3 :(得分:1)

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;
        }
    }
}