3

次の方法に従って、いくつかのxml Xsd検証を行いました: XSDスキーマを使用したXml検証

 .......................................................
 XmlReaderSettings settings = new XmlReaderSettings();
 settings.Schemas.Add(null, xsdFilePath);
 settings.ValidationType = ValidationType.Schema;
 settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler);
 XmlDocument document = new XmlDocument();
 document.Load(xmlFilePath);
 XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings);

 while (rdr.Read())
 {

 }
 ...........................................................

そして、「「ref」属性は存在できません」というエラーが表示されます

私のXSDは次のようになります:

...........
<xs:element name="totals" minOccurs="0" ref="DocTotal"/>
..................................

<xs:element name="DocTotal">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="totalQty" minOccurs="0" type="xs:decimal"/>
            <xs:element name="totalTax" minOccurs="0" type="xs:decimal"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>
</xs:element>

そして私のxmlは次のようになります:

<totals>
    <totalQty>800</totalQty>
    <totalTax>0.00<totalTax>
</totals>

このエラーは、「name」「ref」の両方が原因で発生すると思います: 属性が同じ要素に存在します: ただし、これは XSD では間違っていないと思います (これについてのコメントに感謝します): この場合、これを検証する方法はありますか? XML を使用した XSD:

4

2 に答える 2

4

DocTotal私には、要素ではなくタイプである必要があるように見えます。

<xs:element name="totals" minOccurs="0" type="DocTotal"/>
..................................

<xs:complexType name="DocTotal">
    <xs:sequence>
      <xs:element name="totalQty" minOccurs="0" type="xs:decimal"/>
      <xs:element name="totalTax" minOccurs="0" type="xs:decimal"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" use="required"/>
</xs:complexType>

要素の構造をどこかで定義し(名前ではない)、他の場所で参照する場合は、型にする必要があります。

于 2013-03-13T07:43:34.523 に答える
1

ref最上位の要素宣言では属性が許可されていないため、スキーマは無効です。

これは、少なくともスキーマのスキーマで見ることができます。これは、W3C XML スキーマ勧告の規範的な部分です。http://www.w3.org/TR/xmlschema-1/#normative-schemaスキーマ

属性は、refグローバル (= 最上位で定義) 要素、タイプ、属性、グループなどを参照するために使用されます。同じタイプで名前が異なる 2 つの要素をグローバルに定義する場合は、グローバル (名前付き) を宣言できます。タイプし、要素宣言でそのタイプを参照します。これはtype、@ Damien_The_Unbeliever が回答で行ったように、属性を使用して行われます。

于 2013-03-15T11:52:08.133 に答える