11

オブジェクトによって以前に書き込まれたXMLReaderオブジェクトからオブジェクトを作成しました。StreamXMLWriter

オブジェクトが前方のみであることはわかっているXMLReaderため、現在の読み取り位置を保存できるようにしたいので、読み取りを停止した場所から読み取りを続行できます。

出来ますか?
メモリブロックのチャンクをXMLreader読み取るため、おそらく注意が必要なので、現在のXML要素の読み取りポイントを復元するのが問題になるかもしれません。

確実にわかっている場合にのみアドバイスしてください。具体的には、この問題に関するあなたの経験からうまくいくでしょう。

: 1.そのシナリオのオブジェクト参照
全体を単純に保存することを考えました。 2.位置 = 読み取り要素への現在のポインターであり、他の何かではありません。XMLReader
XMLReaderStream.Position

4

1 に答える 1

1

私は、外部システムが xml を (定義済みの名前空間なしで) 書き込むプロジェクトで作業しており、いくつかの特別な値を持つノードを見つけるためにそれらを読み取る必要があります。

  • 値の準備ができていない場合は、数分後に再度読み取ります。
  • それ以外の場合は、ノードを処理します (属性、値など)。

したがって、次のコードが役立つと思います。

var input1 = @"<root>
 <ta>
   <XGLi6id90>774825484.1418393</XGLi6id90>
   <VAfrBVB>
     <EG60sk>1030847709.7303829</EG60sk>
     <XR>NOT_READY</XR>
   </VAfrBVB>
 </ta>
 <DxshpR>1123</DxshpR>

var input2 = @"<root>
 <ta>
   <XGLi6id90>774825484.1418393</XGLi6id90>
   <VAfrBVB>
     <EG60sk>1030847709.7303829</EG60sk>
     <XR>99999999</XR>
   </VAfrBVB>
 </ta>
 <DxshpR>1123</DxshpR>

var stream1 = new MemoryStream(Encoding.UTF8.GetBytes(input1));
var stream2 = new MemoryStream(Encoding.UTF8.GetBytes(input2));
stream1.Position = 0;
stream2.Position = 0;

var position1 = DoWork(stream1, new Position());
var position2 = DoWork(stream2, position1);

    public static Position DoWork(Stream stream, Position position)
    {
        using (XmlTextReader xmlTextReader = new XmlTextReader(stream))
        {
            using (XmlReader xmlReader = XmlReader.Create(xmlTextReader, xmlReaderSettings))
            {
                // restores the last position 
                xmlTextReader.SetPosition(position);

                System.Diagnostics.Debug.WriteLine(xmlReader.Value); // Second time prints 99999999

                while (xmlReader.Value != "NOT_READY" && xmlReader.Read())
                {
                    // a custom logic to process nodes....
                }

                // saves the position to process later ...
                position = xmlTextReader.GetPosition();

                System.Diagnostics.Debug.WriteLine(xmlReader.Value); // First time prints NOT_READY
            }

        }

        return position;
    }
}

public class Position
{
    public int LinePosition { get; set; }
    public int LineNumber { get; set; }
}

public static class XmlReaderExtensions
{
    public static void SetPosition(this XmlTextReader xmlTextReader, Position position)
    {
        if (position != null)
        {
            while (xmlTextReader.LineNumber < position.LineNumber && xmlTextReader.Read())
            {
            }

            while (xmlTextReader.LinePosition < position.LinePosition && xmlTextReader.Read())
            {
            }
        }
    }

    public static Position GetPosition(this XmlTextReader xmlTextReader)
    {
        Position output;

        if (xmlTextReader.EOF)
        {
            output = new Position();
        }
        else
        {
            output = new Position { LineNumber = xmlTextReader.LineNumber, LinePosition = xmlTextReader.LinePosition };
        }

        return output;
    }
}

重要かつ明らかに、xml の構造 (改行、ノードなど) が常に同じ場合にのみ機能します。それ以外の場合は機能しません。

于 2018-12-26T16:03:17.423 に答える