我有一个基于XSD的嵌套XML结构。我使用JAXB进行编组(只读)。
通常,我需要在大型结构的某处找到一个或多个元素。为了避免每次需要搜索时都遍历结构,我想添加一个带有内部缓存的优化搜索功能。
定义它的最佳方法是什么?不同方式的优点/缺点是什么?
我最初想到使用Facade或适配器,其中adaper类访问生成的类并根据需要添加方法。但是我想提出建议。
作为一个(略)简化的示例,需要搜索基于此XSD的XML,以查找具有特定“ boq”元素的“ step”类型的Elements:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="test">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="group"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="group">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="step"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="step">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="number"/>
<xs:element ref="name"/>
<xs:element ref="type"/>
<xs:element ref="target"/>
<xs:sequence minOccurs="0">
<xs:element ref="boq"/>
<xs:element ref="remote"/>
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="number" type="xs:integer"/>
<xs:element name="name" type="xs:NCName"/>
<xs:element name="type" type="xs:NCName"/>
<xs:element name="target" type="xs:NCName"/>
<xs:element name="boq" type="xs:string"/>
<xs:element name="remote" type="xs:string"/>
</xs:schema>
该模式已使用JAXB进行了编译,因此我得到了几个类。使用解组功能,我在内存中拥有访问XML的数据结构。
现在考虑,我需要一个优化的搜索功能,该功能可以访问定义了boq元素的所有步骤,并返回boq和remote的值(如果也已定义)。
HashMap<String,Step> resultMap = new HashMap<>();
test.getGroup().forEach(group ->
group.getStep().forEach(step -> {
if ("searchpattern".equals(step.getBoq()))
resultMap.put("searchpattern", step);
}));
封装此类搜索的最佳方法是什么?我可以编写第二类作为包含此方法的适配器,还是有更好的选择?遗产?使用JAXB本身的选项?使用第三方插件(例如jaxb-delegate插件)来实现Maven?
相关分类