如何将无效的XML转换为Valid XML

时间:2012-11-21 15:39:21

标签: xml xsd

如何根据给定的xsd-schema将无效的XML转换为Valid XML? 例如,我有下一个xsd架构:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="note">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="to" type="xs:string"/>
      <xs:element name="from" type="xs:string"/>
      <xs:element name="heading" type="xs:string"/>
      <xs:element name="body" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

和下一个无效的XML:

<?xml version="1.0" encoding="UTF-8"?>
<note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../my_xsd.xsd">
  <to>reviver@mail.com</to>
  <from>sender@mail.com</from>
  <body>blablabla</body> <!-- IVALID LINE, IT IS NOT IN RIGHT PALCE -->
  <heading>head</heading>
</note>

我的问题是:JAXB,XSTREAM或其他XML解析器是否有解决方案将我的无效XML转换为有效的XML:

<?xml version="1.0" encoding="UTF-8"?>
<note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../my_xsd.xsd">
  <to>reviver@mail.com</to>
  <from>sender@mail.com</from>
  <heading>head</heading>
  <body>blablabla</body>
</note>

2 个答案:

答案 0 :(得分:1)

如果您需要重新排序的项目,您可能必须首先阅读它们而不使用xsd,然后使用xslt命令它们喜欢xsd。

答案 1 :(得分:0)

假设:我假设输入是格式良好的XML。

一般中,答案是否定的......没有算法可以将任意 XML输入文档转换为有效的并且语义正确给定模式的实例。

但是,如果输入无效的方式约束只是一小部分问题,例如<note>的子元素乱序,然后,几乎任何XML解析和序列化库都可以帮助您解决问题。正如@KevinDTimm所暗示的那样,您需要在这些工具中关闭模式验证,以便在修复输入之前不会拒绝输入。

我个人会使用XSLT,因为那是我习惯的。您可以按照它们出现的顺序读取子元素,并以正确的顺序将它们输出为XML:

<xsl:template match="note">
  <xsl:copy>
    <xsl:apply-templates select="to" />
    <xsl:apply-templates select="from" />
    <xsl:apply-templates select="heading" />
    <xsl:apply-templates select="body" />
  </xsl:copy>
</xsl:template>

但是您列出的示例工具(JAXB和XSTREAM)不仅仅是XML解析器,而是XML object 解析器/序列化器。如果在构建对象时需要更正验证错误,那会使事情变得复杂。一个单独的纠正,然后反序列化的过程会更简单。