【问题标题】:Java: fix malformed XML grouping tags in subgroupsJava:修复子组中格式错误的 XML 分组标签
【发布时间】:2023-03-29 04:40:01
【问题描述】:

我有以下 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>

每个“记录”将有一个&lt;hd&gt;,一个或多个&lt;tr&gt;,以及一个&lt;tl&gt;,完全按照这个顺序。

我想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;

但为此,我必须将每个“记录”分组到 &lt;record&gt; 标记中。

如何在 Java 中做到这一点?

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

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

但后来我陷入了如何插入记录的结束标记的问题上,一旦它应该放在&lt;tl&gt; 标记之后,该标记具有很多属性,例如&lt;tl t01="2" t02="234" ... /&gt;

我认为最好的解决方案可能是使用 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】:

    在 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 编写此代码。

    【讨论】:

      【解决方案2】:

      我能够使用硬编码解决方案修复 XML:

      xml = xml.replaceAll("<hd", "</record><record><hd");
      xml = xml.replaceAll("</root>", "</record></root>");
      xml = xml.replaceFirst("</record>", "");
      

      绝对不漂亮,但我找不到更好的解决方案。

      【讨论】:

        猜你喜欢
        • 2013-06-22
        • 2015-06-19
        • 2011-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多