java - 如何解析具有相同标签名称的嵌套xml标签
问题描述
我有未指定数量的嵌套类别,其中包含项目:
<categories>
<category>abc
<category>cde
<item>someid</item>
<item>someid</item>
<item>someid</item>
<item>someid</item>
</category>
</category>
<category>xyz
<category>zwd
<category>hgw
<item>someid</item>
...
结果应该是嵌套最深的类别(cde 或 hgw)中的项目列表。棘手的是可以有两个以上的类别嵌套级别,我想为子类别保存每个父类别。
我已经用 Jackson XmlMapper 和 ObjectMapper 做了一些 xml 解析,但是这个用例似乎遥不可及。所以我用 javax xml 解析器尝试了它,但放弃了,因为代码看起来很糟糕并且很难阅读。
知道如何以更优雅的方式解决这个问题吗?
解决方案
如果任务是快速从 xml 中提取一些值,那么我会使用 jsoup。Jsoup实际上是一个 html 解析器,但也能够解析 xml。我不确定 jsoup 是否也可以验证 xml 架构并处理命名空间和 ... 这对于其他解析器是可能的。但是阅读一些值 jsoup 通常对我来说就足够了。如果您想查看Jsoup 食谱或选择器语法
马文:
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
使用 jsoup,您的代码可能类似于:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.parser.Parser;
import org.jsoup.select.Elements;
public class Example {
public static void main(String[] args) {
String xml = "<categories>\n"
+ " <category>abc\n"
+ " <category>cde\n"
+ " <item>someid_1</item>\n"
+ " <item>someid_2</item>\n"
+ " <item>someid_3</item>\n"
+ " <item>someid_4</item>\n"
+ " </category>\n"
+ " </category>\n"
+ " <category>xyz\n"
+ " <category>zwd\n"
+ " <category>hgw\n"
+ " <item>someid_5</item>\n"
+ " </category>\n"
+ " </category>\n"
+ " </category>\n"
+ " </categories>";
Document doc = Jsoup.parse(xml, "", Parser.xmlParser());
//if you are interested in Items only
Elements items = doc.select("category > item");
items.forEach(i -> {
System.out.println("Parent text: " +i.parent().ownText());
System.out.println("Item text: "+ i.text());
System.out.println();
});
//if you are interested in categories having at least one direct item element
Elements categories = doc.select("category:has(> item)");
categories.forEach(c -> {
System.out.println(c.ownText());
Elements children = c.children();
children.forEach(ch -> {
System.out.println(ch.text());
});
System.out.println();
});
}
}
输出:
Parent text: cde
Item text: someid_1
Parent text: cde
Item text: someid_2
Parent text: cde
Item text: someid_3
Parent text: cde
Item text: someid_4
Parent text: hgw
Item text: someid_5
cde
someid_1
someid_2
someid_3
someid_4
hgw
someid_5
推荐阅读
- android - 在具有多个视图类型的 Recycler 视图中,项目在向上滚动时重复
- javascript - 如何将多个对象转换为单个数组
- hadoop - 执行 hive 查询导致纱线资源管理器抛出文件不存在异常
- python - 使用熊猫从.txt文件中导入数据,在列之间使用换行符
- prolog - Prolog:解决 Peg Jumping 问题(启发式/A*)
- css - 样式化 ng-invalid select2 元素
- python - 视图 app_name.views.signup 未返回 HttpResponse 对象。它返回 None 。对于现有用户名
- angularjs - 使用模态控制器访问主控制器方法
- javascript - 定期更新 iFrame 中的 CSS
- r - R按id计算日期变量的连续数