我有以下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)));
但是我不知道如何进行。
任何想法都会受到欢迎。
在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编写。