无法通过将xml字符串转换为流来验证xml

时间:2012-08-15 17:53:41

标签: c# xml xsd

I am not able to find exact exception, when debugging, I can just find this info我以字符串格式通过Web服务获取xml并通过xmlreader,我将字符串转换为流对象。但无法弄清楚我错过了什么。这里提到的xml和模式是一个示例。

class Program
{
    static void Main(string[] args)
    {
        try
        {

            XmlDocument doc = new XmlDocument();

            doc.Load("books.xml");
            StringWriter sw = new StringWriter();
            XmlTextWriter tx = new XmlTextWriter(sw);
            doc.WriteTo(tx);
            string leadxml = sw.ToString();

            XmlReaderSettings xmlSettings = new XmlReaderSettings();
            xmlSettings.Schemas = new System.Xml.Schema.XmlSchemaSet();
            xmlSettings.Schemas.Add(string.Empty,"books.xsd");
            xmlSettings.ValidationType = ValidationType.Schema;
            byte[] byteArray = Encoding.ASCII.GetBytes(leadxml);
            MemoryStream stream = new MemoryStream(byteArray);
            XmlReader reader = XmlReader.Create(stream, xmlSettings);

            // Parse the file.
            while (reader.Read());


        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);

        }
    }

}

xml是:

 <?xml version="1.0" encoding="utf-8" ?>
<bookstore>
  <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0"/>
</bookstore>

xsd是:

    <?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="bookstore">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="book">

        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

2 个答案:

答案 0 :(得分:1)

StringWriter默认采用UTF-16编码,这意味着您将获得一个包含UTF-16的XML声明。然后,您使用Encoding.ASCII来获取二进制表示,但这与UTF-16声明不兼容。

老实说,为什么你一开始就这么做并不是很清楚 - 几乎可以肯定有更好的方法来实现你的目标,但我们无法真正说明你的目标 ,所以我们不能建议更好的方式。

编辑:例如,这个可能就是你真正想要的:

XmlReaderSettings xmlSettings = new XmlReaderSettings
{
    Schemas = { { "", "books.xsd" } },
    ValidationType = ValidationType.Schema
}
using (var reader = XmlReader.Create("books.xml", xmlSettings))
{
    while (reader.Read()) {}
}

答案 1 :(得分:1)

首先,如果您所做的一切都是将Xml放入字符串中,那么整个代码块都是不必要的:

          XmlDocument doc = new XmlDocument();
          doc.Load("books.xml");
          StringWriter sw = new StringWriter();
          XmlTextWriter tx = new XmlTextWriter(sw);
          doc.WriteTo(tx);
          string leadxml = sw.ToString();

而只是做:

          string leadxml = File.ReadAllText("books.xml");

其次,如果你已经有了一个字符串,那么完全没必要对字符串进行所有这些转换。 XmlReader.Create方法具有接受TextReader的签名。 StringReader派生自TextReader。因此,这个:

             byte[] byteArray = Encoding.ASCII.GetBytes(leadxml);
             MemoryStream stream = new MemoryStream(byteArray);
             XmlReader reader = XmlReader.Create(stream, xmlSettings);

可以替换为:

             StringReader leadxmlStringReader = new StringReader(leadXml);
             XmlReader reader = XmlReader.Create(leadxmlStringReader, xmlSettings);

如果对此问题有任何进一步的帮助,您需要提供例外详细信息和/或特定错误消息。