Java: исправление некорректных тегов группировки XML в подгруппах - PullRequest
0 голосов
/ 11 декабря 2019

У меня есть следующий 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" ... />.

Я думаю, что, возможно, лучшим решением было бы использование Document объекта XML.

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

Но я не знаю, как поступить.

Любые идеи могли быприветствовать.

1 Ответ

0 голосов
/ 11 декабря 2019

Очень просто в 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, если у вас не хватает времени.

...