如何根据给定的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>
答案 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 解析器/序列化器。如果在构建对象时需要更正验证错误,那会使事情变得复杂。一个单独的纠正,然后反序列化的过程会更简单。