XIncludeのスキーマ/名前空間の検証?
-
11-09-2019 - |
質問
私は、XMLは、人間とマシンの両方で使用できる必要がある大規模なXML構造を管理しやすくするために含まれて使用しようとしています。
しかし、既存のスキーマに対して検証することができますXMLファイルを構築しようとしたときの問題の無数を経験しています。ここで私は何をしようとしているの簡単な例です。
私の "main.xml" ファイルが検証されません。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xml - This fails to validate. -->
<ns1:main xsi:schemaLocation="http://www.example.com/main main.xsd"
xmlns:ns1="http://www.example.com/main"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xi="http://www.w3.org/2001/XInclude">
<name>String</name>
<xi:include href="child.xml"/> <!-- What I'm trying to do. -->
</ns1:main>
"child.xml" ファイルは、スタンドアロンのファイルとして細かい検証します。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Child.xml - This validates fine, as a standalone file. -->
<ns1:child xsi:schemaLocation="http://www.example.com/main main.xsd"
xmlns:ns1="http://www.example.com/main"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<name>String</name>
<age>String</age>
</ns1:child>
ここに私のスキーマです。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xsd - My Simplified Schema -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="http://www.example.com/main"
targetNamespace="http://www.example.com/main">
<!-- Main Element (References Child) -->
<xs:element name="main">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element ref="ns1:child"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- Child Element -->
<xs:element name="child">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
私の問題は、ほとんど、明らかに名前空間に関連しているが、私は私の問題を解決する方法のための損失でね。
解決
のskaffman のは、すでにXMLスキーマおよびXIncludeに互換性がない、指摘したようにます。
xmllintするからの検証エラーメッセージがこれを明確に述べます:
main.xml:9: element include: Schemas validity error : Element '{http://www.w3.org/2001/XInclude}include': This element is not expected. Expected is ( {http://www.example.com/main}child ).
main.xml fails to validate
W3C勧告を引用すると:「XIncludeのはとは関係が定義されていないが増補インフォセットは、XMLスキーマを適用することによって生成した。このような拡張情報セットは、入力情報セットとして供給することができ、またはそのような増強が包含に起因する情報セットに適用される可能性があります。 "
このように、あなたが最初XINCLUDESを適用することによって、全体のXMLファイルを作成する必要があり、その後、このファイルを検証します。
編集:あなたはmain.xmlを検証する--xincludeとのxmllint の使用することができます。
他のヒント
私はgrantwparksに同意 - のXIncludeおよびXMLスキーマは絶対に一緒に使用することができます。仕様は、互いに意図的に独立しています。どうやらのXIncludeの著者は、検証の前または検証後に処理することが含ま聞かせする自由を提供したいと考えました。
問題と解答を説明しのvelocityreviewsのこのスレッドそれが問題を理解するために私を助けたことでこの記事でしたxml.com に、そこから引用します:
のXIncludeに関する一般的な質問の一つは、どのように含むことです 検証、XSL変換、および他のプロセスと相互作用します それは、XML文書に適用することができます。短い答えはそれということです しません。 XInclusionは、他のXMLプロセスの一部ではありません。それは いつ、どこでそれはあなたがまたは実行できない場合があります別のステップ あなたにとって有用ます。
たとえば、スキーマに対する検証を考えます。文書が可能 含める、またはその両方の後、封入前に検証。あなたが検証した場合 XI前に文書:要素を含むが、その後、置き換えられます ちょうどそれが希望のような要素を含む:スキーマは、XIを宣言する必要があります 他の要素を宣言します。あなたは後にドキュメントを検証した場合 XI:要素が交換されて含まれ、スキーマは宣言する必要があります 交換要素。インクルージョンと検証は、分離されています 任意の順序で実行することができる直交する工程 ローカル環境での便利な
だから、煮詰めるように見えるものを、XIを処理するために、あなたのXMLツールを取得することです。(それはOPのニーズにどのような一例である)、検証前の要素が含まれます。例えば、EclipseののXMLエディタで、XMLの下の設定「プロセスXML介在物」がある - > XMLファイル] - > [検証XIを処理するためのエディタを取得するためにオンにする必要があり、(RSA 8.5を使用して):前に含ま検証ます。
アンディ
私は、XMLスキーマおよびXInclude仕様は相互に互換性があることが保証されていないと思います。個々のXMLプロセッサは、それを許可するかもしれないが、他の人はしません。
一般的なルールとして、私は2つを一緒に使用してはならないことを言うと思います。
P.S。あなたは、これは名前空間の問題だと思う私はなぜわかりません。どのようなあなたのような印象を与えます?
私は、これはXIncludeのとスキーマ間の非互換性によって引き起こされるとは思いません。インクルードを検証する前に処理されていません含めるようにそれは私には見えます。メインの要素、唯一の「子」要素「を含む」のためにこのようにスキーマが許可されていません。あなたがプロセスにあなたのXMLプロセッサを強制することができれば、検証の前に含まれています...