10

XSD 機能に対するもう 1 つの課題として

、クライアントから XML ファイルを送信してきました。このファイルには、0 個以上の未定義または [call] 予期しないタグ (階層に表示される場合があります) が含まれます。それらは私にとって冗長なタグです..そのため、それらの存在を無視する必要がありますが、検証が必要なタグのセットがいくつかあります。

これはサンプル XML です。

<root>
  <undefined_1>one</undefined_1>
  <undefined_2>two</undefined_2>
  <node>to_be_validated</node>
  <undefined_3>two</undefined_3>
  <undefined_4>two</undefined_4>
</root>

そして、私が試したXSD:

  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType

特定の理由により、XSD はこれを許可しません。
上記の例はほんの一例です。実用的な XML には、XML タグの複雑な階層が付属しています。

ハックできるかどうか教えてください。

ちなみに、別の解決策は、検証プロセスの前に XSL 変換を挿入することです。まあ、少なくとも私の会社でサポートされている検証プロセスをトリガーする.Netコードを変更する必要があるため、私はそれを避けています。

4

5 に答える 5

5

これをまだ行っていない場合は、次のことを試してください。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root" type="root"></xs:element>
  <xs:complexType name="root">
    <xs:sequence>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
      <xs:element name="node" type="xs:string"/>
      <xs:any maxOccurs="2" minOccurs="0" processContents="skip"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Linux では、これは libxml バージョン 20706 を使用する xmllint で問題なく動作します。

于 2011-11-02T21:02:01.240 に答える
3

結論:

これは XSD では不可能です。私が要件を達成しようとしていたすべてのアプローチは、検証ツールによって「あいまい」と名付けられ、多数のエラーが伴いました。

于 2010-03-09T09:55:55.680 に答える
2

「オープン コンテンツ」と呼ばれる XML 1.1 の新機能を利用できます。つまり、追加の「不明な」要素をさまざまな位置で複合型に追加できること、およびそれらの要素のいずれかにヒットした場合にパーサーが何をすべきかを指定できます。

XML 1.1 を使用すると、複合型は次のようになります。

<xs:element name="root" type="root" />
<xs:complexType name="root"> 
  <xs:openContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:openContent>

  <xs:sequence> 
    <xs:element name="node" type="xs:string"/> 
  </xs:sequence> 
</xs:complexType>

複雑なタイプが多数ある場合は、スキーマの上部に「デフォルト」のオープン コンテンツ モードを設定することもできます。

<xs:schema ...>
  <xs:defaultOpenContent mode="interleave">
    <xs:any namespace="##any" processContents="skip"/>
  </xs:defaultOpenContent>

  ...
</xs:schema>

オープン コンテンツの W3C 仕様はhttp://www.w3.org/TR/xmlschema11-1/#ocにあります。これについては、http://www.ibm.com/developerworks/libraryに詳しい記事があります。 /x-xml11pt3/#N102BA .

残念ながら、.NET は現時点で XML 1.1 をサポートしていません。無料の XML 1.1 プロセッサはまだ見つかりませんが、有料のオプションがいくつかあります。

于 2015-09-23T12:42:56.763 に答える
1

私は同じ問題に直面しました。

.NET から検証を呼び出したので、回避策として、特定の検証エラーを抑制することにしましValidationEventHandlerた。それは私のために働いた。

    private void ValidationEventHandler(object sender, ValidationEventArgs e)
    {
        switch (e.Severity)
        {
            case XmlSeverityType.Warning:
                // Processing warnings
                break;
            case XmlSeverityType.Error:
                if (IgnoreUnknownTags
                    && e.Exception is XmlSchemaValidationException
                    && new Regex(
                        @"The element '.*' has invalid child element '.*'\."
                        + @" List of possible elements expected:'.*'\.")
                       .IsMatch(e.Exception.Message))
                {
                    return;
                }
                // Processing errors
                break;
            default:
                throw new InvalidEnumArgumentException("Severity should be one of the valid values");
        }
    }

これを機能させるには、英語に設定するか、現在のスレッドにThread.CurrentUICulture設定する必要があります。CultureInfo.InvariantCulture

于 2014-10-06T07:14:30.597 に答える
1

名前空間を使用することは可能かもしれません:

<xs:element name="root" type="root"></xs:element> 
  <xs:complexType name="root"> 
    <xs:sequence> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns1.com" /> 
      <xs:element name="node" type="xs:string"/> 
      <xs:any maxOccurs="2" minOccurs="0" namespace="http://ns2.com"/> 
    </xs:sequence> 
  </xs:complexType>

これはおそらく検証されます。

于 2010-03-08T16:32:56.370 に答える