2016-11-17 8 views
2

Xml検証は、私がしなければならないとき以外は触れるものではないので、何か愚かな私は行方不明で、これまでのところ私はグーグルで何か助けに失敗しました。私の問題は、文字かスペースしかないという制限があるタイプがあることです。先頭の改行を持つ要素は検証に失敗しますが、末尾に改行が入ります。後続の改行が失敗するようにするにはどうすればよいですか?XSDバリデーションが末尾改行に失敗しない

次のように私が剥ぎ取らテストケースを作成しました:

検証コード:

public List<XsdValidationError> ValidateXmlAgainstXsd(String xml, String xsdFilePath, Boolean processSchemaLocation = false) 
{ 
    var ret = new List<XsdValidationError>(); 
    var xss = new XmlSchemaSet(); 

    var xmlUrlResolver = new XmlUrlResolver(); 
    xmlUrlResolver.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default); 
    xss.XmlResolver = xmlUrlResolver; 

    var xsdXElement = XElement.Parse(File.ReadAllText(xsdFilePath)); 

    var targetNamespaceAttribute = xsdXElement.Attribute("targetNamespace"); 
    xss.Add(targetNamespaceAttribute != null ? targetNamespaceAttribute.Value : "", xsdFilePath); 


    var settings = new XmlReaderSettings(); 
    settings.ValidationType = ValidationType.Schema; 
    settings.Schemas = xss; 
    settings.ValidationFlags = XmlSchemaValidationFlags.ProcessInlineSchema; 

    if (processSchemaLocation) 
     settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessSchemaLocation; 
    settings.ValidationEventHandler += (sender, e) => 
     { 
      var xve = new XsdValidationError { Message = e.Message, LineNumber = e.Exception.LineNumber, LinePosition = e.Exception.LinePosition }; 

      ret.Add(xve); 
     }; 

    using (var sr = new StringReader(xml)) 
    { 
     var xr = XmlReader.Create(sr, settings); 

     while (xr.Read()); 

     return ret; 
    } 
} 

public class XsdValidationError 
{ 
    public String Message { get; set; } 
    public int LineNumber { get; set; } 
    public int LinePosition { get; set; } 

    public override string ToString() 
    { 
     return String.Format("Line {0:n0}, Position {1:n0}: {2}", this.LineNumber, this.LinePosition, this.Message); 
    } 
} 

入力XMLおよびXSD:1が失敗しないXMLの人で

<People> 
    <Person>Hello Person One 
</Person> 
    <Person>Hello Person Two</Person> 
    <Person> 
Hello Person Three</Person> 
</People> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="People"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Person" maxOccurs="unbounded"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:pattern value="[a-zA-Z ]+"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

、人は2回通過する必要があり、人3は失敗するはずです。私も失敗する人1が必要です。

入力XMLまたはXSDを変更できません。 Visual Studioはファイルを正しく検証します。何か案は?

答えて

0

xmlDocumentを使用してxmlを読み込むと、正しく検証されますが、行番号情報が失われることが発見されました。私はボンネットの下で何が起こっているのか分からないが、これに変更することは私の状況で正しく検証されるだろう。

var xd = new XmlDocument(); 
xd.LoadXml(xml); 
var xr = XmlReader.Create(new XmlNodeReader(xd), settings); 
1

私はこれがMicrosoftのXSDパーサーのバグであると思います。 XSの定義:文字列型は次のとおりです。 -

<xsd:simpleType name="string" id="string"> 
    <xsd:restriction base="xsd:anySimpleType"> 
    <xsd:whiteSpace value="preserve"/> 
    </xsd:restriction> 
</xsd:simpleType> 

空白ファセットが、それは要素、空白とすべてのすべてを含まなければならない「保存」に設定されています。

しかし、後ろの空白を無視して気づいたように。あなたのコードで手作業で検証ルールを適用する以外に、これについて多くのことを行うことはできないようです。

これは、Xercesで予想どおりに有効となります(先頭と末尾の空白の両方でエラーが発生します)。

+0

私はグーグルでこの問題に似た何かを見つけることができないので、このようなバグです。私はこの問題に直面した最初の人ではないと思います。しかし、Xercesは私に試してみる何かを与えるので、ありがとう! – schlechtums

関連する問題