13

私はこのシナリオを得ました:

while (reader.Read())
{
    if (reader.NodeType == XmlNodeType.Element && reader.Name == itemElementName)
    {
        XElement item = null;
        try
        {
            item = XElement.ReadFrom(reader) as XElement;
        }
        catch (XmlException ex)
        {
           //log line number and stuff from XmlException class  
        }
    }
}

上記のループでは、特定のノード(itemElementName)をXElementに変換しています。

一部のノードは優れたXMLであり、XElementに入りますが、そうでないノードもあります。

CATCHでは、標準のXmlExceptionのものをキャッチするだけでなく、現在のXmlの抽出と文字列もキャッチしたいと思います。

ただし、ノードをXElementに渡す前にノードで何らかのREAD操作を実行すると、リーダーが前方に移動します。

リーダーのOuterXmlの内容の「スナップショット」を、その位置に干渉することなく取得するにはどうすればよいですか?

4

6 に答える 6

11

実際、ReadSubtreeは、元のリーダーを「ラップ」するリーダーを返します。したがって、新しいものを読むことは、元のものも同様に進めることになります。XmlReaderはフォワードオンリーリーダーと見なす必要があります。単に戻ることはできません。シナリオに関しては、XMLの一部を覚えようとする代わりに、入力ファイル内の位置をリーダーに尋ねることができます。IXmlLineInfoインターフェイスにキャストするだけで、行と位置を返すメソッドがあります。これを使用すると、開始位置(問題の要素の前)とエラーの終了位置を覚えることができます。次に、入力ファイルからその部分をプレーンテキストとして読み取ります。

于 2010-06-18T22:40:10.413 に答える
5

別のアイデア:外側のXML(リーダーを進める)を読み取り、このXMLから新しいリーダーを作成して、「戻って」現在のノードの要素を処理できるようにします。

while (r.ReadToFollowing("ParentNode"))
{
    parentXml = r.ReadOuterXml();

    //since ReadOuterXml() advances the reader to the next parent node, create a new reader to read the remaining elements of the current parent
    XmlReader r2 = XmlReader.Create(new StringReader(parentXml));
    r2.ReadToFollowing("ChildNode");
    childValue = r2.ReadElementContentAsString();
    r2.Close();
}                  
于 2015-07-17T16:56:54.630 に答える
4

リーダーで「読み取り」操作を使用しないでください-あなたが発見したように、これはそれを前進させます。reader.HasValueおよびなどのプロパティへの呼び出しを使用reader.Valueして、コンテンツを検査します。オブジェクトブラウザで「XmlReader」を検索します。読み取ることができるプロパティはかなりあります。

編集:おそらく現在のノードがXmlWhiteSpace、XmlTextノード、さらにはXmlAttributeなど、それ自体では有効なXMLではない可能性があるため、単純にXMLを取得する簡単な方法はないと思います。

于 2010-06-01T08:19:52.243 に答える
1

私がしたことは、要素だけをXmlDocumentに読み取り、代わりにそれを読み取ることでした。私の場合、フロードキュメントをHTMLに変換する必要がありました。親HTML要素に「スタイル」を割り当てるために内部要素を読み取る必要がありました。

于 2016-09-12T06:50:45.817 に答える
0

実際、Vitek Karas MSFTは正しいですが、HelenaKupkovaはhttps://msdn.microsoft.com/en-us/library/aa302292.aspxで巧妙な小さなXMLブックマークリーダーを公開しました。これにより、キャッシュを使用して逆方向に進むことができます。

于 2015-01-22T11:39:14.510 に答える
0

ReadSubtreeでそのようなもの

using (XmlReader reader = XmlReader.Create(new StringReader(xml)))
                                {
                                    reader.MoveToContent();
                                    while (reader.Read())
                                    {
                                        switch (reader.NodeType)
                                        {
                                            case XmlNodeType.Element:
                                                if (reader.Name == "Field") // for example i need to read node field
                                                {

                                                    XmlReader inner = reader.ReadSubtree();  // the reader stays in the same  position
                                                    XElement El = XElement.Load(inner) as XElement;
                                                    inner.Close();
                                                }
                                        }
                                    }
                                }
于 2020-06-16T09:17:48.900 に答える