سؤال

لا أحد يعرف كيف يمكنني الحصول على رقم السطر الحالي من System.Xml.XmlReader؟ أحاول أن يسجل فيها في ملف أجد عناصر XML.

هل كانت مفيدة؟

المحلول

والاستفادة من IXmlLineInfo واجهة تدعمها وXmlReader:

IXmlLineInfo xmlInfo = (IXmlLineInfo)reader;
int lineNumber = xmlInfo.LineNumber;

نصائح أخرى

والتوسع في واجهة IXmlLineInfo وثائق هذه هي سيئة جدا. من فعل شيئا من الحفر، استطيع ان اقول لكم ما يلي:

1) System.Xml.XmlReader غير مجردة، لذلك كنت أبدا أن يكون التعامل مع مثيل هذا، على هذا النحو، والحقيقة أنه لا تنفيذ IXmlLineInfo لا تتعلق بشكل كبير (على الرغم من، إذا كان الأمر كذلك، فإنه سوف جعل كل شيء فقط أن قليلا أسهل :))

2) يوفر واجهة System.Xml.IXmlLineInfo خاصيتين: LineNumber وLinePosition (التي هي الأشياء نحن نهتم)، بالإضافة إلى الأسلوب:. HasLineInfo() التي، وفقا للوثائق، سوف تتيح لك معرفة ما إذا كان منفذة يمكن إرجاع lineinfo

و3) من ورثة موثقة من System.Xml.XmlReader، لدينا:

System.Xml.XmlDictionaryReader - abstract, used by WCF for serialization, no IXmlLineInfo
System.Xml.XmlNodeReader - used when reading a node, no IXmlLineInfo
System.Xml.XmlTextReader - used when reading a stream of data, has IXmlLineInfo
System.Xml.XmlValidatingReader - used when reading a stream of data and validating, has IXmlLineInfo.

وبالنظر إلى القائمة أعلاه، وXmlDictionaryReader سوف يتم استخدامها داخليا، وXmlNodeReader سوف يتم استخدامها عندما كنت قد مرت في عقدة يجب أن تقرأ (الذي، بعد أن تم تحليل، وقررت الصين بالفعل من وثيقة مصدرها )، وXmlTextReader وXmlValidtingReader (كلاهما تنفيذ IXmlLineInfo)، وعلى وشك أن يستخدم عندما كنت تقرأ من وثيقة. لذا، فإن طويلة وقصيرة من ذلك يبدو أن ذلك إذا كان من الممكن أو من المفيد أن أقدم لكم موقف من المعلومات، الإطار سوف تفعل ذلك.

وأن يقال، وثائق ويبدو أن خفيفة جدا. بعد أن فعل هذا فقط، وانتهى بي الأمر به (مع _xr كونه التنفيذ الفعلي غير معروف من System.Xml.XmlReader):

string position = "(unknown)";
    if (_xr != null && typeof(System.Xml.IXmlLineInfo).IsInstanceOfType(_xr) &&
((System.Xml.IXmlLineInfo)_xr).HasLineInfo())
    {
        System.Xml.IXmlLineInfo li = (System.Xml.IXmlLineInfo)_xr;
        position = "(" + li.LineNumber.ToString() + "," + li.LinePosition.ToString() + ")";
    }

ومع كل ما يقال، عندما كنت في الواقع تشغيل التعليمات البرمجية أعلاه، نوع _xr ينتهي به الأمر System.Xml.XsdValidatingReader (حظا سعيدا العثور على وثائق على ذلك!)، الذي يرث من System.Xml.XmlReader، ولكن لا يرث من System.Xml.XmlValidatingReader أو System.Xml.XmlTextReader . على هذا النحو، وربما من الحكمة استخدام نهج مثل ما ورد أعلاه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top