4

ファイルからすべてのXMLコンテンツを読み取りたい。以下のコードは、XML宣言(<?xml version="1.0" encoding="UTF-8"?>)が削除された場合にのみ機能します。XML宣言を削除せずにファイルを読み取るための最良の方法は何ですか?

XmlTextReader reader = new XmlTextReader(@"c:\my path\a.xml");
            reader.Read();
            string rs = reader.ReadOuterXml();

XML宣言を削除せずreader.ReadOuterXml()に、空の文字列を返します。

<?xml version="1.0" encoding="UTF-8"?>  
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
    <a:Action s:mustUnderstand="1">http://www.as.com/ver/ver.IClaimver/Car</a:Action>
    <a:MessageID>urn:uuid:b22149b6-2e70-46aa-8b01-c2841c70c1c7</a:MessageID>
    <ActivityId CorrelationId="16b385f3-34bd-45ff-ad13-8652baeaeb8a" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">04eb5b59-cd42-47c6-a946-d840a6cde42b</ActivityId>
    <a:ReplyTo>
      <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
    </a:ReplyTo>
    <a:To s:mustUnderstand="1">http://localhost/ver.Web/ver2011.svc</a:To>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Car xmlns="http://www.as.com/ver">
      <carApplication>
        <HB_Base xsi:type="HB" xmlns="urn:core">
          <Header>
            <Advisor>
              <AdvisorLocalAuthorityCode>11</AdvisorLocalAuthorityCode>
              <AdvisorType>1</AdvisorType>
            </Advisor>
          </Header>
          <General>
            <ApplyForHB>yes</ApplyForHB>
            <ApplyForCTB>yes</ApplyForCTB>
            <ApplyForFSL>yes</ApplyForFSL>
            <ConsentSupplied>no</ConsentSupplied>
            <SupportingDocumentsSupplied>no</SupportingDocumentsSupplied>
          </General>
        </HB_Base>
      </carApplication>
    </Car>
  </s:Body>
</s:Envelope>

アップデート

非xmlリーダーを使用する他のメソッドを知っています(たとえば、を使用しFile.ReadAllText())ます。しかし、xmlメソッドを使用する方法を知る必要があります。

4

5 に答える 5

6

<?xml ?>BOM以外のエンコーディング宣言の前にテキストまたは空白を含めることはできません。また、宣言とルート要素の間に改行以外のテキストを含めることはできません。

それ以外は無効なドキュメントです。

アップデート:

XmlTextReader.read()に対するあなたの期待は間違っていると思います。

XmlTextReader.Read()を呼び出すたびに、XMLドキュメント内の次の「トークン」が一度に1つずつステップ実行されます。「トークン」とは、XML要素、空白、テキスト、およびXMLエンコーディング宣言を意味します。

XMLファイルの最初のトークンがXML宣言であり、XML宣言にOuterXMLがないため、reader.ReadOuterXML()を呼び出すと空の文字列が返されます。

このコードを考えてみましょう:

    XmlTextReader reader = new XmlTextReader("test.xml");
    reader.Read();
    Console.WriteLine(reader.NodeType);  // XMLDeclaration
    reader.Read();
    Console.WriteLine(reader.NodeType);  // Whitespace
    reader.Read();
    Console.WriteLine(reader.NodeType);  // Element
    string rs = reader.ReadOuterXml();

上記のコードは次の出力を生成します:

XmlDeclaration
Whitespace
Element

最初の「トークン」はXML宣言です。

検出された2番目の「トークン」は、XML宣言の後の改行です。

遭遇した3番目の「トークン」は<s:Envelope>要素です。ここからreader.ReadOuterXML()を呼び出すと、期待しているもの<s:Envelope>、つまり石鹸パケット全体である要素のテキストが返されます。

XMLファイルをオブジェクトとしてメモリにロードすることが本当に必要な場合は、呼び出し var doc = XDocument.Load("test.xml") て、一挙に解析を実行します。

システムメモリに収まらないほど巨大なXMLドキュメントを使用している場合を除いて、XMLドキュメントを一度に1トークンずつ調べていく理由はそれほど多くありません。

于 2011-12-16T19:18:53.680 に答える
2

どうですか

XmlDocument doc=new XmlDocument;
doc.Load(@"c:\my path\a.xml");
//Now we have the XML document - convert it to a String
//There are many ways to do this, one should be:
StringWriter sw=new StringWriter();
doc.Save(sw);
String finalresult=sw.ToString();
于 2011-12-16T19:09:56.943 に答える
1

編集:ドキュメント宣言とルート要素の間に実際にテキストがあることを意味していると思います。そうでない場合は、明確にしてください。

余分なテキストを削除しないと、それは単に無効なXMLファイルです。私はそれがうまくいくとは思わないでしょ。XMLファイルはありません。XMLファイルに少し似ていますが、ルート要素の前に無関係なものがあります。

于 2011-12-16T19:05:54.570 に答える
1

私見あなたはこのファイルを読むことができません。これは、ルート要素の前にプレーンテキストがあり、<s:Envelope>ドキュメント全体が無効になるためです。

于 2011-12-16T19:09:19.603 に答える
0

ソーステキストを取得するためだけにXMLドキュメントをXMLとして解析していますか?なんで?

あなたが本当にそれをしたいのなら:

string rs;
using(var rdr = new StreamReader(@"c:\my path\a.xml"))
  rs = rdr.ReadToEnd();

動作しますが、それが実際に必要なものかどうかはわかりません。これは、XMLであることをほとんど無視し、テキストを読み取るだけです。いくつかのことに役立ちますが、それほど多くはありません。

于 2011-12-16T19:12:10.630 に答える