Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法通过将xml字符串转换为流来验证xml_C#_Xml_Xsd - Fatal编程技术网

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

C# 无法通过将xml字符串转换为流来验证xml,c#,xml,xsd,C#,Xml,Xsd,我通过web服务以字符串格式获取xml,并通过xmlreader,将字符串转换为流对象。但我无法找出我遗漏了什么。这里提到的xml和模式是一个示例 class Program { static void Main(string[] args) { try { XmlDocument doc = new XmlDocument(); doc.Load("books.xml");

我通过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>


默认情况下,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()) {}
}

首先,如果您所做的只是将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");
其次,如果您已经有一个字符串,那么完全不需要对该字符串进行所有这些转换。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);

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

不使用XML类直接处理值而不是(错误地)在字符串/流/字节数组之间转换的原因是什么?我猜问题是在转换为流或xmlreader.create()时但无法解决。-问题1:如果你不知道你的问题和目标是什么,没有人能够帮助你解决它(预期:我想做XXXX,但失败了YYYY错误/意外结果),那么我应该使用什么来代替UTF-16?UTF-8@SidP当前位置你应该告诉我们你的真正目标,然后我们可以给你更好的建议。为什么要从文件中读取数据,然后保存为字符串,然后将该字符串转换为字节数组?我在上面已经说过,我是通过webservice以字符串格式获取xml的。这里是示例,我已加载为文件。这样我就不必粘贴web服务代码了。@SidP:那么您实际上根本就没有任何
StringWriter
代码了?您的代码中有多少是问题中的代码?正如丹尼尔所问,实际的问题是什么?你有例外吗?如果是,是什么?请阅读+1到这个问题/-1到问题。。。(我怀疑答案应该是XmlDocument.LoadXml)