gpt4 book ai didi

java - XML API 或开源 jar,用于根据给定路径提取 XML 子集

转载 作者:行者123 更新时间:2023-11-30 06:13:40 25 4
gpt4 key购买 nike

我想知道是否有 API 或开源 jar 可以根据给定路径提取 XML 子集。

例如:我有一个XML,它是一个骨架(阴模型,从阳模型转换而来)

<xml .....>
<data>
<model1>
<element1>
<id />
<name />
<address />
</element1>
</model1>
<model2>
<element2>
<uid />
<something />
</element2>
</model2>
....
</data>

给定路径:

data/model1/element1[id='1']/name  and  name value is 'John'

我希望返回以下内容

<xml .....>
<data>
<model1>
<element1>
<id>1</id>
<name>John</name>
</element1>
</model1>
<data>

我不太确定要搜索什么关键字。希望对 XML 有足够了解的人能够提供建议。

另一个问题是,如果没有现有的 API 或开源代码,处理这个问题的最佳方法是什么?我应该使用 DOM 因为我需要骨架中的整个(树)结构吗?除了 DOM 使用过多内存之外,还有哪些副作用?

最佳答案

您可以使用内置包 javax.xml读取和写入数据。您可以使用 XML path language (XPath) 查询 XML 。例如提取<element1>的子树:

/data/model1/element1

或者提取 <element1> 的子树其中子元素<id>有文本“1”:

/data/model1/element1[id/text() = 1] 

我写了一个小程序来演示用法。你需要

  • 创建 org.w3c.dom.Document
  • 将 XML 内容解析到此对象中
  • 编译您的 XPath 表达式
  • 使用编译后的 xpath 提取文档 NodeList
  • 导出 NodeList或执行任何其他所需的任务。

您可以按如下方式编译程序并运行:

$ javac Demo.java
$ java Demo /data/model1/element1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data>
<model1>
<element1>

<id>1</id>

<name>John</name>

<address>xxx</address>

</element1>
<element1>

<id>2</id>

<name>Tom</name>

<address>yyy</address>

</element1>
</model1>
</data>

~ $ java Demo '/data/model1/element1[id/text() = 1]'
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<data>
<model1>
<element1>

<id>1</id>

<name>John</name>

<address>xxx</address>

</element1>
</model1>
</data>
<小时/>

完整的程序:

import java.io.*;
import java.nio.charset.StandardCharsets;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.*;
import org.w3c.dom.*;

public class Demo {

private static final String XML =
"<?xml version=\"1.0\"?>\n"
+ "<data>\n"
+ " <model1>\n"
+ " <element1>\n"
+ " <id>1</id>\n"
+ " <name>John</name>\n"
+ " <address>xxx</address>\n"
+ " </element1>\n"
+ " <element1>\n"
+ " <id>2</id>\n"
+ " <name>Tom</name>\n"
+ " <address>yyy</address>\n"
+ " </element1>\n"
+ " </model1>\n"
+ " <model2>\n"
+ " <element2>\n"
+ " <uid />\n"
+ " <something />\n"
+ " </element2>\n"
+ " </model2>"
+ "</data>";

public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document source;
try (InputStream in = new ByteArrayInputStream(XML.getBytes(StandardCharsets.UTF_8))) {
source = factory.newDocumentBuilder().parse(in);
}

// Extract
XPath xPath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xPath.compile(args[0]);

NodeList nodeList = (NodeList) expr.evaluate(source, XPathConstants.NODESET);

// Export
Document target = factory.newDocumentBuilder().newDocument();
Element data = target.createElement("data");
Element model1 = target.createElement("model1");
data.appendChild(model1);
target.appendChild(data);
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
Node newNode = target.importNode(node, true);
model1.appendChild(newNode);
}
System.out.println(getStringFrom(target));
}

private static String getStringFrom(Document doc) throws TransformerException {
DOMSource domSource = new DOMSource(doc);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
// set indent
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
transformer.transform(domSource, result);
return writer.toString();
}
}

关于java - XML API 或开源 jar,用于根据给定路径提取 XML 子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49705234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com