我以字符串格式通过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>
答案 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);
如果对此问题有任何进一步的帮助,您需要提供例外详细信息和/或特定错误消息。