1

送信されたスキーマを使用してクライアント XML を検証しようとしています。概略的には、次のようになります。

<?xml version="1.0" encoding="UTF-8">
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.client.com"
           targetNamespace="http://www.client.com"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           version="0.1">

<xs:element name="root">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Parent" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="Parent">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="Child1" type="xs:string"/>
      <xs:element name="Child2" type="xs:string" nillable="true"/>
      <xs:element name="Child3" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

検証したい XML の例は次のようになります。

<Parent>
  <Child1>Entry</Child1>
  <Child2 xsi:nil="true"/>
  <Child3>Entry</Child3>
</Parent>

私の質問はこれです: 上記の XML は実際に整形式ですか? 私の XML の (不十分な) 理解は、名前空間が「xsi」タグに必要であると考えさせます。実際、これを検証すると、エラーが発生します (タグ「xsi」は名前空間にバインドされていません)。XML を次のように変更します。

<Parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Child1>Entry</Child1>
  <Child2 xsi:nil="true"/>
  <Child3>Entry</Child3>
</Parent>

私たち側の問題を修正し、私にとってより理にかなっています。しかし、クライアントは、元の XML は XMLSpy と VisualStudio で検証されると言っていたので、何か不足しているのではないでしょうか?

どんな助けでも大歓迎です。どうもありがとう!

4

2 に答える 2

0

要素を名前空間にバインドする必要がありますか?

要素は常に「名前空間名」にバインドされます。名前空間に URI が指定されていない場合、「名前空間名」には値がありません。その後、noNamespaceSchemaLocation 属性を使用して要素の型を定義できます。

たとえば、xml が対象の名前空間と一致する場合、次のように記述します。

<Parent xmlns="http://www.client.com" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.client.com client.xsd">
...
</Parent>

<!--
Remarks:
(Line 1) default namespace (when using no prefix) = "http://www.client.com"
(Line 3) provided that `client.xsd` is the correct client schema location.
-->

この場合、要素Parentと要素の両方が「 http://www.client.comChild 」名前空間に属しており、バリデーターは xml を検証する必要があることを認識しています。

スキーマで が宣言されていない場合、スキーマtargetNamespace="http://www.client.com"に対して検証するには、次のように記述する必要があります。

<Parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://www.client.com client.xsd">
...
</Parent>

この場合、 と の両方が「値なし」名前空間ParentChild属しているため、「no-targetNamespaced」スキーマに対して検証されます。

プレフィックスを名前空間にバインドする必要はありますか?

あなたの例では、これがあなたが求めているものだと思います。仕様から:

プレフィックスは、修飾名の名前空間プレフィックス部分を提供し、名前空間宣言で名前空間 URI 参照に関連付ける必要があります。

はい、それらをバインドする必要があります。

于 2014-07-17T07:40:18.003 に答える
0

整形式の XML と有効な XML には違いがあります。あなたの例は整形式ですが、有効ではありません。スキーマが定義されている場合、妥当性が明らかになります。

以下の2つの記事を読んでください

  1. http://dli.grainer.uiuc.edu/publications/xmltutorial/xml/tsld005.htm
  2. ドキュメントでの XSD スキーマの参照
于 2013-04-29T13:38:52.503 に答える