4

以下を使用すると、無効な子要素エラーが常に発生します。私は XML を初めて使用し、これを理解しようとネットを調べましたが、うまくいきませんでした。アプリケーションに送信された XML を検証する別の XSD があり、うまく機能しますが、要素ではなく属性を使用しています。XSDの要素を使用して、私が制御できないサードパーティのアプリケーションから送信されたXMLを検証することはできません。

XSD

<?xml version="1.0" encoding="Windows-1252"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"     xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="SCCAParticipationList">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="Entry">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Address" type="xs:string" minOccurs="0" />
              <xs:element name="CarModel" type="xs:string" minOccurs="0" />
              <xs:element name="CarNo" type="xs:string" minOccurs="0" />
              <xs:element name="TotalTm" type="xs:string" minOccurs="0" />
              <xs:element name="BestTm" type="xs:string" minOccurs="0" />
              <xs:element name="Region" type="xs:string" minOccurs="0" />
              <xs:element name="MemberNo" type="xs:string" minOccurs="1" />
              <xs:element name="FirstName" type="xs:string" minOccurs="1" />
              <xs:element name="LastName" type="xs:string" minOccurs="1" />
              <xs:element name="Class" type="xs:string" minOccurs="1" />
              <xs:element name="Pos" type="xs:string" minOccurs="1" />
              <xs:element name="UniqueID" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XML

<?xml version="1.0"?>
<SCCAParticipationList>
  <Entry>
    <MemberNo>3333333</MemberNo>
    <FirstName>Test</FirstName>
    <LastName>Person</LastName>
    <Class>stt</Class>
    <Pos>13</Pos>
    <CarModel>Mazda Miata</CarModel>
    <Address>123 Test Dr ,The Woodlands TX,55555,US</Address>
  </Entry>
  <Entry>
    <MemberNo>2222222</MemberNo>
    <FirstName>John</FirstName>
    <LastName>Doe</LastName>
    <Class>sio</Class>
    <Pos>3T</Pos>
    <CarModel>Subaru Impreza</CarModel>
    <Address>111 Test Circle ,Austin TX,77777,US</Address>
  </Entry>
</SCCAParticipationList>

C#

protected Boolean VerifyXmlwElements(string strSchemaPath, string strXml) { try {
byte[] byteArray = Encoding.ASCII.GetBytes(strXml); MemoryStream stream = new MemoryStream(byteArray); XmlTextReader xmlr = new XmlTextReader(stream); XmlValidatingReader xmlvread = new XmlValidatingReader(xmlr); xmlvread.Schemas.Add(null, strSchemaPath);

            xmlvread.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

            while (xmlvread.Read()) { }

            xmlvread.Close();

            if (intErrCount > 0)
            {
                intErrCount--;
                throw new Exception(strErrMessage);
            }
            strErrMessage = "XML validation succeeded!\r\n";
            return true;
        }
        catch (Exception ex)
        {
            intErrCount++;
            strErrMessage = "Invalid XML - " + ex.Message + intErrCount.ToString() + " Error(s)\r\n";
            return false;
        }
    }

    private void ValidationCallBack(Object sender, ValidationEventArgs args)
    {
        if (args.Message.ToLower().Contains("attribute is not declared"))
        {
            return;
        }
        intErrCount++;
        return;
    }

4

1 に答える 1

9

少なくとも 1 つの問題は、Entry 子要素の順序が間違っていることです。シーケンス タグで定義された要素は、対応する XML ドキュメントに同じ順序で表示される必要があります。

スキーマに対してサンプル XML を検証した後、これが唯一の問題でした。

編集:

入力ファイルの要素の順序を制御できず、一貫性がなく、Entry の各子要素が Entry ごとに最大 1 回しか表示されない場合は、sequence ではなくall要素を使用することをお勧めします。

于 2012-06-04T18:50:44.093 に答える