2012-11-21 45 views
2

如何根據給定的xsd-schema將無效的XML轉換爲有效的XML? 例如,我有下一個XSD架構:如何將無效的XML轉換爲有效的XML

<?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>[email protected]</to> 
    <from>[email protected]</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>[email protected]</to> 
    <from>[email protected]</from> 
    <heading>head</heading> 
    <body>blablabla</body> 
</note> 

回答

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 對象解析器/序列化程序。如果您在構建對象時需要糾正驗證錯誤,那會使事情變得複雜。一個單獨的糾正和反序列化過程會更簡單。

+0

實際 - 是的。我期望得到速度很快的XML,但是元素順序不正確。並且我需要的主要功能 - 按正確順序放置元素和屬性,並根據給定的XSD。 –

+0

@AleksandrZhytnikov:請注意,上述模板旨在與身份模板一起使用(http://en.wikipedia.org/wiki/Identity_transform#Using_XSLT)。或者,您可以用'copy-of'替換'apply-templates'。 – LarsH

1

如果您需要重新排序的項目,你可能必須先閱讀,而不XSD,然後使用XSLT命令他們到t他喜歡xsd。

相關問題