Java:修复子组中格式错误的XML分组标签

问题描述 投票:0回答:1

我有以下XML:

<root>
   <hd h01="728" ... />
   <tr t01="12" ... />
   <tr t01="16" ... />
   <tl t01="9" ... />
   <hd h01="0" ... />
   <tr t01="33" ... />
   <tl t01="2" ... />
   ...
</root>

我需要像这样:

<root>
   <record>
      <hd h01="728" ... />
      <tr t01="12" ... />
      <tr t01="16" ... />
      <tl t01="9" ... />
   </record>
   <record>
      <hd h01="0" ... />
      <tr t01="33" ... />
      <tl t01="2" ... />
   </record>
</root>

每个“记录”将按此精确顺序具有一个<hd>,一个或多个<tr>和一个<tl>

我想使用以下模型类来unmarshal

@XmlRootElement(name = "root")
public class RootXml {

  @XmlElement(name = "record")
  private RecordXml record;

@XmlRootElement(name = "record")
public class RecordXml {

  @XmlElement(name="hd")
  private HdXml hd;

  @XmlElement(name="tr")
  private List<TrXml> tr;

  @XmlElement(name="tl")
  private TlXml tl;

但是为此,我必须将<record>标签中的每个“记录”分组。

如何用Java做到这一点?

首先,我想到了这样的硬编码解决方案:

xmlString = xmlString.replaceAll("<hd", "<record><hd");

但是一旦将其放置在具有很多属性,例如<tl><tl t01="2" t02="234" ... />标记之后,我就陷入了如何插入记录的close标记的困扰。

我认为最好的解决方案可能是使用XML的Document对象。

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document doc = builder.parse(new InputSource(new StringReader(xmlString))); 

但是我不知道如何进行。

任何想法都会受到欢迎。

java xml dom xml-parsing unmarshalling
1个回答
0
投票

在XSLT 2.0中非常简单:

<xsl:template match="root">
 <xsl:for-each-group select="*" group-starting-with="hd">
   <record>
     <xsl:copy-of select="current-group()"/>
   </record>
 </xsl:for-each-group>
<xsl:template>

除非您有足够的时间,否则请不要尝试用Java编写。

© www.soinside.com 2019 - 2024. All rights reserved.