質問

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 コードを変更する必要があるため、これを避けています。

役に立ちましたか?

解決 2

結論ます:

これは、XSDでは不可能です。私は要件を達成しようとしていたすべてのアプローチは、エラーの束を伴う、検証、ツールによって「曖昧」と命名した。

他のヒント

の場合には、あなたのすでにこれを行っていない、あなたは次のことを試してみてください。

<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で正常に動作します。

たぶん、その名前空間を使用することが可能です。

<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>

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

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

私は、.NETからの検証と呼ばれているので、私は<のhref = "http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k%28System.Xml.XmlReaderSettings.ValidationEventHandler%29に特定の検証エラーを抑制することを決めました。 K%28ValidationEventHandler%29; K%28TargetFrameworkMoniker-.NETFramework、バージョン%3Dv4.5%29; K%28DevLang-CSHARP%29&RD = TRUE」RELは= "nofollowを"> 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に設定しなければならないことが重要です。

「オープン コンテンツ」と呼ばれる 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 プロセッサは見つかりません。ただし、有料のオプションがいくつかあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top