كيف يمكن للمرء أن يجد مساحات XML غير معروفة في وثيقة؟

StackOverflow https://stackoverflow.com/questions/509967

سؤال

وعلى وجه التحديد (أخذ نفس عميق): كيف يمكنك أن تذهب نحو إيجاد جميع المساحات اسم XML ضمن C # / XmlDocument NET التي لا توجد مخططات المعمول بها في XmlSchemaSet المقام في (الملكية Schemas)

وبلدي كسباث السحر تفتقر إلى التطور أن تفعل شيئا من هذا القبيل، ولكنني لن أظل أبحث في هذه الأثناء ...

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

المحلول

وكنت بحاجة للحصول على قائمة من كافة مساحات متميزة في الوثيقة، ثم قارن ذلك مع مساحات متميزة في مجموعة المخطط.

ولكن عادة لا تتعرض أسماء تصريح مساحة اسم في نموذج وثيقة كسباث. ولكن نظرا عقدة يمكنك الحصول على مساحة لها:

// Match every element and attribute in the document
var allNodes = xmlDoc.SelectNodes("//(*|@*)");
var found = new Dictionary<String, bool>(); // Want a Set<string> really
foreach (XmlNode n in allNodes) {
  found[n.NamespaceURI] = true;
}
var allNamespaces = found.Keys.OrderBy(s => s);

نصائح أخرى

وأسهل طريقة وجدتها من أي وقت مضى لاسترداد كافة مساحات من XmlDocument معين هو كسباث من خلال كافة العقد العثور البادئة وNamespaceURI قيم فريدة.

ولقد حصلت على روتين المساعد التي يمكنني استخدامها لإعادة هذه القيم الفريدة في XmlNamespaceManager لجعل الحياة أكثر بساطة عندما أتعامل مع مستندات XML المعقدة.

والرمز هو كما يلي:

private static XmlNamespaceManager PrepopulateNamespaces( XmlDocument document )
{
    XmlNamespaceManager result = new XmlNamespaceManager( document.NameTable );
    var namespaces = ( from XmlNode n in document.SelectNodes( "//*|@*" )
                       where n.NamespaceURI != string.Empty
                       select new
                       {
                           Prefix = n.Prefix,
                           Namespace = n.NamespaceURI
                       } ).Distinct();

    foreach ( var item in namespaces )
        result.AddNamespace( item.Prefix, item.Namespace );

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