C# 无法通过将xml字符串转换为流来验证xml
我通过web服务以字符串格式获取xml,并通过xmlreader,将字符串转换为流对象。但我无法找出我遗漏了什么。这里提到的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");
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)