2016-12-08 2 views
0

XMLを持っていますが、検証する必要はありませんし、シーケンスも、コードを書いていますが動作しません。XML検証XSDをC言語で使用していない場合#

XML

<?xml version="1.0" encoding="utf-8" ?> 

<TXLife> 
    <UserAuthRequest> 
    <UserPswd> 
     <CryptType>NONE</CryptType> 
     <Pswd/> 
    </UserPswd> 
    <VendorApp> 
     <VendorName>AAA</VendorName> 
     <AppName>BBB</AppName> 
    </VendorApp> 
    </UserAuthRequest> 
</TXLife> 

XSD

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="XMLSchema1" 
    targetNamespace="http://tempuri.org/NewApplicationSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema1.xsd" 
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 
    <xs:element name="TXLife"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="UserAuthRequest" minOccurs="1"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="UserLoginName" type="xs:string" minOccurs="1"></xs:element> 
       <xs:element name="UserPswd"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="CryptType" type="xs:string"></xs:element> 
        <xs:element name="Pswd"></xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
       <xs:element name="VendorApp"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="VendorName"> 
         <xs:complexType> 
         <xs:attribute name="VendorCode" type="xs:int"></xs:attribute> 
         </xs:complexType> 
        </xs:element> 
        <xs:element name="AppName" type="xs:string"></xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
     <xs:attribute name="VendorCode" type="xs:int"></xs:attribute> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

C#コード:

public void ValidateXML1() 
     { 
      List<string> _errors = new List<string>(); 
      try 
      { 
       XmlSchemaSet schemas = new XmlSchemaSet(); 
       schemas.Add("http://tempuri.org/NewApplicationSchema.xsd", _sourceXsd); 

       XDocument doc = XDocument.Load(_sourceXml); 
       string msg = ""; 
       doc.Validate(schemas, (o, e) => 
       { 
        _errors.Add(e.Message); 
        msg += e.Message + Environment.NewLine; 
       }); 
      } 
      catch (Exception e) 
      { 

      } 

     } 

あなたは私がXML<UserLoginName>を供給していませんでしたが、私のXSDで、それはMだと見ることができるようにinOccures=1、このコードを実行すると、 d error message =0を示していますが、私は<UserLoginName>値を供給しないというエラーが予想されます。

答えて

1

XMLファイルにスキーマの名前空間がありません。

<TXLife xmlns="http://tempuri.org/NewApplicationSchema.xsd"> 
    ... 
</TXLife> 
+0

XMLはユーザー入力ですから、スキーマなしでそのXMLを検証する方法はありますか? –

+0

それがうまくいくかどうかわかりませんが、 'schemas.Add(" "、_sourceXsd);' –

+0

を試してください。XML文書にスキーマ内のtargetnamespace属性で定義された名前空間が含まれていない場合、正しく検証されません。したがって、スキーマを変更するかXMLを変更する2つのオプションがあります。いったん読み込まれると、コード内のXMLを変更して、名前空間をルート要素に強制することができます。 – Sprotty

関連する問題