-1

我找不到确切的异常,调试时,我只能找到这个信息我通过 Web 服务以字符串格式获取 xml 并通过 xmlreader,我将字符串转换为流对象。但无法弄清楚我错过了什么。这里提到的 xml 和 schema 是一个示例。

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>
4

2 回答 2

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()) {}
}
于 2012-08-15T17:55:58.563 回答
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);

有关此问题的任何进一步帮助,您将需要提供异常详细信息和/或特定错误消息。

于 2012-08-15T18:33:22.847 回答