c# - التعامل - كيفية القراءة من زملريدر دون تحريكها إلى الأمام



.net xml (4)

يا رفاق، لقد حصلت على هذا السيناريو:

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  
        }
    }
}

في الحلقة أعلاه أنا تحويل عقدة معينة (إيتمليمنتنام) إلى زليمنت.

بعض العقد ستكون شمل جيدة وسوف تذهب إلى زليمنت، ومع ذلك، فإن بعض لا.

في كاتش، أود أن ليس فقط قبض على الأشياء زملكسيبتيون القياسية ... أود أيضا أن قبض على مقتطف من شمل الحالي وسلسلة.

ومع ذلك، إذا قمت بأي نوع من عملية القراءة على العقدة قبل أن تمريرها إلى زليمنت، فإنه يتحرك القارئ إلى الأمام.

كيف يمكن الحصول على "لقطة" لمحتويات أوتركسمل للقارئ دون التدخل في موقفه؟

https://src-bin.com


Answer #1

لا تستخدم أي عملية "قراءة" على القارئ - كما اكتشفت، هذا التقدم. استخدام المكالمات إلى خصائص مثل reader.HasValue reader.Value لفحص محتويات. بحث عن 'زملريدر' في متصفح الكائن، وهناك عدد قليل جدا من الخصائص التي يمكنك قراءتها.

تحرير: لا أعتقد أن هناك طريقة سهلة ببساطة الحصول على شمل، ربما لأن العقدة الحالية قد لا تكون صالحة شمل على انها الخاصة، مثل زملوايتسباس، زملتكست عقدة أو حتى زملاتريبوت.


Answer #2

في الواقع ريادزوبتري سيعود القارئ الذي "يلتف" القارئ الأصلي. حتى القراءة من خلال واحد جديد سوف ينتهي في نهاية المطاف واحد الأصلي أيضا. يجب أن تنظر زملريدر كقارئ إلى الأمام فقط، فإنه ببساطة لا يمكن أن أعود. أما بالنسبة للسيناريو الخاص بك، بدلا من محاولة تذكر جزء من شمل يمكنك أن تطلب من القارئ للموقف في ملف الإدخال. يلقي فقط إلى واجهة إكسملينينفو، فقد أساليب لإعادة الخط والموقف. باستخدام هذا يمكن أن نتذكر بعض نقطة البداية (قبل العنصر في السؤال) ثم الموقف النهائي للخطأ. ومن ثم قراءة هذا الجزء من ملف الإدخال كنص عادي.


Answer #3

فكرة أخرى: قراءة شمل الخارجية (التي تقدم القارئ)، ثم إنشاء قارئ جديد من هذا شمل الذي يسمح لك "العودة" ومعالجة عناصر العقدة الحالية.

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();
}                  

Answer #4

ما فعلته كان يقرأ فقط العنصر في زملدوكومنت، وقراءة ذلك بدلا من ذلك. في حالتي، كان علي تحويل وثيقة تدفق إلى هتمل. كان علي قراءة عنصر داخلي لتعيين "نمط" لعنصر هتمل الأصلي.





xmlreader