不明なタグの検証を無視するにはどうすればよいですか?
-
18-09-2019 - |
質問
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 プロセッサは見つかりません。ただし、有料のオプションがいくつかあります。