2

指定された xsd-schema に従って、無効な XML を有効な 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>
4

2 に答える 2

1

アイテムを並べ替える必要がある場合は、最初に xsd なしでそれらを読み取ってから、xslt を使用して xsd の好みに合わせて並べ替える必要があります。

于 2012-11-21T15:47:49.593 に答える
0

前提: 入力は整形式の XML であると想定します。

一般に、答えはノーです...任意のXML 入力ドキュメントを有効で意味的に正しい特定のスキーマのインスタンスに変換できるアルゴリズムはありません。

ただし、入力が無効になる可能性のある方法が、子要素の順序が正しくないなど、ごく一部の問題に限定されている場合は、そうです。ほぼすべての XML 解析およびシリアル化ライブラリが問題の修正に役立ちます。@KevinDTimm がほのめかしたように、これらのツールでスキーマ検証をオフにして、入力を修正する前に拒否しないようにする必要があります。<note>

個人的には、XSLT に慣れているので、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オブジェクトパーサー/シリアライザーです。オブジェクトの構築中に検証エラーを修正する必要がある場合、それは複雑になります。修正してから逆シリアル化する別のプロセスは、より簡単になります。

于 2012-11-21T15:50:44.717 に答える