gpt4 book ai didi

java - XML - Java 中的 XPath DOM 解析器

转载 作者:太空宇宙 更新时间:2023-11-04 10:33:58 27 4
gpt4 key购买 nike

我有以下 XML:

<docs>
<doc>
<person>
<name>John Doe</name>
<description>
<age>23</age>
<alias>M C</alias>
</description>
<description>
<age>24</age>
<alias>John</alias>
</description>
</person>
<doc>
<doc>
<person>
<name>John Doe</name>
<description>
<age>24</age>
<alias>Steve</alias>
</description>
</person>
<doc>
</docs>

我无法控制 xml。我得到的只是这样的 xml 文档和元素的 xpath。我写了一个java程序来读取数据并将其转换为Json对象。我正在使用 xPath 和 dom 解析器,并且由于我们获得了 xml 的 xPath,我想我会使用它,因为 xPath 将来可能会发生变化。因此,我对属性文件中的所有元素都有 xPath,因此如果有更改,我将在程序中进行最少的更改。不幸的是,程序应该不区分大小写,所以我使用translate(xPath)来处理它。我有以下类(class)

public class Person {
private List<String> name;
private List<String> age;
private List<String> alias;
//getter and setter
}

问题是有多个文档节点,每个文档节点可以有多个年龄和别名元素。早些时候这不是必需的,所以我使用 XPath 来获取文本,但现在我不能使用它,因为//person/description 的 xPath 将返回 3 个节点,其中 2 个来自第一个文档,一个来自另一个文档。问题是我需要区分描述标签来说明它是来自第一个文档还是另一个文档。所以最终的 Json 看起来像

{
"docs":
{
"doc":
[
{
"description":
[
{
"age": 23,
"alias": "M C"
},
{
"age": 24,
"alias": "John"
}
]
},
{
"description":
[
{
"age": 24,
"alias": "Steve"
}
]
}
]
}
}

所以我能想到的就是编译 xPath 表达式 -//docs/doc,此时我将有 2 个节点并获取子节点并通过获取子节点进行循环并执行类似 if 的操作

element.getTagName().equalsIgnoreCase("age") 

然后添加到年龄列表,然后像列表列表一样,所以我最终会得到

docs[[[23, "M C"],[24, "John"]],[[24, "Steve"]]]

还有更好的想法吗?

最佳答案

XPath 的替代方案是 Java JSON library 。该库具有使用 XML 和生成 JSON 的功能。要完成此转换,请使用以下命令:

public class Main {

private static int SPACES_PER_INDENT = 4;

public static void main(String[] args) throws Exception {

try {
// Citation: https://stackoverflow.com/questions/1823264/quickest-way-to-convert-xml-to-json-in-java
URI file = Main.class.getClassLoader().getResource("docs.xml").toURI();
String xmlContents = readFromInputStream(file);
JSONObject jsonContents = XML.toJSONObject(xmlContents);
String jsonString = jsonContents.toString(SPACES_PER_INDENT);
System.out.println(jsonString);
}
catch (JSONException e) {
e.printStackTrace();
}
}

private static String readFromInputStream(URI uri) throws IOException {
// Citation: http://www.baeldung.com/reading-file-in-java
Path path = Paths.get(uri);
StringBuilder data = new StringBuilder();

Stream<String> lines = Files.lines(path);
lines.forEach(line -> data.append(line).append("\n"));
lines.close();

return data.toString();
}
}

docs.xml的内容位于类路径中,如下所示(请注意,我将问题中的 <doc>...<doc> 标记更改为 <doc>...</doc> ):

<docs>
<doc>
<person>
<name>John Doe</name>
<description>
<age>23</age>
<alias>M C</alias>
</description>
<description>
<age>24</age>
<alias>John</alias>
</description>
</person>
</doc>
<doc>
<person>
<name>John Doe</name>
<description>
<age>24</age>
<alias>Steve</alias>
</description>
</person>
</doc>
</docs>

pom.xml这个项目是:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow.albanoj2</groupId>
<artifactId>XmlToJson</artifactId>
<version>0.0.1-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
</dependencies>
</project>

结果输出是:

{"docs": {"doc": [
{"person": {
"name": "John Doe",
"description": [
{
"alias": "M C",
"age": 23
},
{
"alias": "John",
"age": 24
}
]
}},
{"person": {
"name": "John Doe",
"description": {
"alias": "Steve",
"age": 24
}
}}
]}}

如果更容易阅读,此解决方案的源代码包含在以下存储库中:https://github.com/albanoj2/XmlToJsonDocTranslation 。请注意,这个答案的大部分来自 Quickest way to convert XML to JSON in Java ,但已针对此问题的特定需求进行了定制(例如从文件中读取 XML)。

关于java - XML - Java 中的 XPath DOM 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49681469/

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