-1

正確な例外を見つけることができません。デバッグ時に、この情報を見つけることができます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>
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 に答える