java - 使用过滤器解析 XML

标签 java xml

我用java解析XML文档:

doc = DocumentBuilderFactory
           .newInstance()
           .newDocumentBuilder()
           .parse(new URL(url).openStream());

工作,但是可以用一些过滤器进行解析吗?例如,我的 XML 文件有一个属性优先级,可以使用过滤器进行解析,例如优先级>8?

因此,在文档中只有优先级 > 8 的元素。

XML 示例:

<url>
<loc>http</loc>
<lastmod>2015-02-26</lastmod>
<title>Hello</titolo>
<priority>1.0</priority>
</url>
...

谢谢

最佳答案

对于以下名为 urls.xml 的示例输入文件

<root>
    <url>
        <loc>http</loc>
        <lastmod>2015-02-26</lastmod>
        <title>Hello</title>
        <priority>1.0</priority>
    </url>
    <url>
        <loc>http</loc>
        <lastmod>2015-02-26</lastmod>
        <title>Hello</title>
        <priority>7.0</priority>
    </url>
    <url>
        <loc>http</loc>
        <lastmod>2015-02-26</lastmod>
        <title>Hello</title>
        <priority>10.0</priority>
    </url>
</root>

您首先像往常一样创建完整的文档

Document document = DocumentBuilderFactory
           .newInstance()
           .newDocumentBuilder()
           .parse(new File("urls.xml"));

然后运行 ​​XPath 查询,选择高于特定优先级的所有Node

XPathExpression expr = XPathFactory.newInstance()
                      .newXPath().compile("//url[priority > 5]");
NodeList urls = (NodeList) expr.evaluate(document, XPathConstants.NODESET);

如果要将结果序列化到另一个 xml 文件,请先创建一个新的 Document

Document result = DocumentBuilderFactory.newInstance()
        .newDocumentBuilder().newDocument();
Node root = result.createElement("results");
result.appendChild(root);

然后将过滤后的 url Node 附加为

for (int i = 0; i < urls.getLength(); i++) {
    Node copy = result.importNode(urls.item(i), true);
    root.appendChild(result.createTextNode("\n\t"));
    root.appendChild(copy);
}
root.appendChild(result.createTextNode("\n"));

现在,您需要做的就是将新的 Document 序列化为 String 并将其写入文件。我只是将其打印到控制台上。

System.out.println(
        ((DOMImplementationLS) result.getImplementation())
        .createLSSerializer().writeToString(result));

输出:

<?xml version="1.0" encoding="UTF-16"?>
<results>
    <url>
        <loc>http</loc>
        <lastmod>2015-02-26</lastmod>
        <title>Hello</title>
        <priority>7.0</priority>
    </url>
    <url>
        <loc>http</loc>
        <lastmod>2015-02-26</lastmod>
        <title>Hello</title>
        <priority>10.0</priority>
    </url>
</results>

关于java - 使用过滤器解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28746413/

相关文章:

java - 带有 spring boot 错误自动配置的 H2 嵌入式数据库

xml - 用 Java 托管 XML 的简单服务器

java - 内容值无法访问value.put();

Java简单服务器客户端

java - 如何初始化一个Hashmap的arraylist?

python - 在 python 中解析 xbrl 文件

xml - 当子节点满足一定条件时移除 XML 节点

java - 使用 XmlUtils 解析 XML

java - 如何从java类的服务层函数中反复调用ajax来显示页码状态?

c# - excel xml窗口宽度属性