有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

但后来我陷入了如何插入record的close标记的困境,一旦它应该放在<tl>标记之后,该标记有很多属性,比如<tl t01="2" t02="234" ... />

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

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

但我不知道如何继续

任何想法都会受到欢迎


共 (2) 个答案

  1. # 1 楼答案

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

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

    这肯定不漂亮,但我找不到更好的解决办法

  2. # 2 楼答案

    在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写这篇文章