当前位置: 首页 > 知识库问答 >
问题:

JAXB:有没有办法在XML中只散集特定的路径?

谭向晨
2023-03-14

我有一个XSD,它定义了几个复杂类型的层次结构(每个类型都是另一个的子类型)。

前任:

<xs:schema version="1.3"
  targetNamespace="https://www.domain.com/schema/reports/export/1.0"
  xmlns:tns="https://www.domain.com/schema/reports/export/1.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified">

<xs:element name="detailedreport">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="severity" minOccurs="6" maxOccurs="6" type="tns:SeverityType" />
    </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:complexType name="SeverityType">
  <xs:sequence>
    <xs:element name="category" minOccurs="0" maxOccurs="unbounded" type="tns:CategoryType"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="CategoryType">
  <xs:sequence>
    <xs:element name="cwe" maxOccurs="unbounded" type="tns:CweType"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="CweType">
  <xs:sequence>
    <xs:element name="staticflaws" type="tns:FlawListType" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="FlawListType">
  <xs:sequence>
    <xs:element name="flaw" minOccurs="0" maxOccurs="unbounded" type="tns:FlawType" />
  </xs:sequence>
</xs:complexType>

<xs:complexType name="FlawType">
  <xs:sequence>
    <xs:element name="mitigations" minOccurs="0" maxOccurs="1" type="tns:MitigationListType" />
    <xs:element name="exploit_desc" type="tns:LongTextType" minOccurs="0" maxOccurs="1"/>
  </xs:sequence>
</xs:complexType>


<xs:complexType name="MitigationListType">
  <xs:sequence>
    <xs:element name="mitigation" minOccurs="0" maxOccurs="unbounded" type="tns:MitigationType"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="MitigationType">
  <xs:attribute name="action" type="xs:string" use="required"/>
  <xs:attribute name="description" type="xs:string" use="required"/>
  <xs:attribute name="user" type="xs:string" use="required"/>
  <xs:attribute name="date" type="xs:string" use="required"/>
</xs:complexType>

</xs:schema>

我正在寻找只导入复杂类型缺陷类型到列表中。我想我可能可以使用ApacheDigester来做这件事,但是我想知道是否有一些方法可以用JAXB来做这件事。直接解组到详细报告对象,然后使用循环来提取缺陷类型是可行的,但似乎需要大量额外的工作。

本质上,我希望能够想出一个解决方案,可以做到如下几点:

   String xml = FileUtils.readFileToString( XML_File );
   unmarshaller = JAXBContext.createUnmarshaller();
   // only unmarhsal nodes of FlawType.class from the xml file.
   List<FlawType> flawTypes = unmarshaller.unmarshal( xml, FlawType.class );

我可能会将整个XML文件加载到一个DOM对象中,然后使用XPath之类的方法来定位所有的DefirType节点,对于每个节点,使用解组器来为每个节点html" target="_blank">执行此操作,但不知道是否有更简单的方法。我想我可能也能使用某种形式的SAX解析器(我从来没有使用过),但我希望有更直接的东西。

实际上,我正在使用Spring 4框架和sping-oxm包来处理许多JAXB的跑腿工作,所以我很想找到一个简单的解决方案,它将很容易理解和维护。使用像Digester这样的东西只会给我的堆栈增加更多的技术,这是我宁愿避免的。

有没有一种简单的方法可以用JAXB实现这一点,或者这超出了JAXB的范围?

共有1个答案

易嘉胜
2023-03-14

我设法找到了以下解决方案,但不认为这是最漂亮的:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder(); 
Document doc = db.parse(IOUtils.toInputStream(xml));
NodeList nodeList = doc.getElementsByTagName("cwe");

JAXBContext jc = JAXBContext.newInstance( CweType.class );
Unmarshaller u = jc.createUnmarshaller();

List<CweType> cwes = new ArrayList<>();
for( int i = 0; i < nodeList.getLength(); i++ )
    cwes.add( u.unmarshal(nodeList.item(i),  CweType.class);

我希望能有点整洁。首先,我不喜欢必须手动搜索名为cwe的元素的想法。至少,我希望能够从生成的cWebType类或CategoryType类中获取元素名,但我看到的唯一方法是反射。这是唯一的办法吗?

 类似资料:
  • 我正在尝试创建一个通用的绑定文件,在多个项目中从WSDLs/XSD生成一致的Java类。我们通过(由@lexicore制作)生成代码。 问题在于多项目部分。如果特定的绑定指令与提供的XSD或WSDL中的任何内容都不匹配,则类生成失败 对“

  • 我已经看到,这在其他类型的对话框窗口中是可能的,如“ShowConfirmDialog”,其中可以指定按钮的数量和它们的名称;但是在使用“ShowInputDialog”时是否可以实现相同的功能?我似乎在API中找不到这种类型的东西。也许我只是错过了,但任何帮助都很感激。

  • 问题内容: 说我有这样的代码: 通常,仅当所有其他调用a()-d()返回true时,才调用e()。是否可能有一些编译器或JVM选项来禁用短路评估,所以无论其他函数的结果如何,都将始终调用e()? 基本上我正在做一个大型系统的UAT,需要测试e(),但是设置确保所有a(),b()等返回true的环境和场景都是非常痛苦的… 编辑:好的,我猜想使用位AND代替逻辑可以提供某种解决方法,但是理想情况下,我

  • 我正在创建一个"深"路径方案在FiRecovery.(6部分路径,3个集合和3个文档)类似于或在更真实的世界示例: 所以问题是Firestore允许在嵌套子集合中为当前不存在的文档的任何路径添加文档。因此,当在路径的末尾添加用户评论文档时,如果它们不存在,它会自动添加和文档,但这些文档是空的(或者在控制台中说,“不存在”),因此不会出现在查询或快照中。 会发生的情况是,在集合中会有很多文档,但我无

  • getExternalStorage()现在在4.4A中,指向模拟存储...由于基本的android手机没有外部SD卡的选项,而其他手机有该选项,有没有办法获取外部SD卡的路径? 首先非常感谢,

  • 例如,分区有1-10的偏移量。我只想从3-8消费。在消耗了第8条消息后,程序应该退出。