رقم السطر الحالي من System.Xml.XmlReader (C # و صافي)
-
05-07-2019 - |
سؤال
لا أحد يعرف كيف يمكنني الحصول على رقم السطر الحالي من 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
. على هذا النحو، وربما من الحكمة استخدام نهج مثل ما ورد أعلاه.