تحليل زدوكومنت دون الحاجة إلى الاستمرار في تحديد مساحة الاسم الافتراضية

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

سؤال

لدي بعض بيانات شمل (على غرار العينة أدناه) وأريد قراءة القيم في التعليمات البرمجية.

لماذا أجبر على تحديد مساحة الاسم الافتراضية للوصول إلى كل عنصر?كنت أتوقع استخدام مساحة الاسم الافتراضية لجميع العناصر.

هل هناك طريقة أكثر منطقية لتحقيق هدفي?

عينة شمل:

<?xml version="1.0" encoding="UTF-8"?>
<ReceiptsBatch xmlns="http://www.secretsonline.gov.uk/secrets">
    <MessageHeader>
        <MessageID>00000173</MessageID>
        <Timestamp>2009-10-28T16:50:01</Timestamp>
        <MessageCheck>BX4f+RmNCVCsT5g</MessageCheck>
    </MessageHeader>
    <Receipts>
        <Receipt>
            <Status>OK</Status>
        </Receipt>
    </Receipts>
</ReceiptsBatch>

رمز لقراءة عناصر شمل أنا بعد:

XDocument xDoc = XDocument.Load( FileInPath );

XNamespace ns = "http://www.secretsonline.gov.uk/secrets";

XElement MessageCheck = xDoc.Element(ns+ "MessageHeader").Element(ns+"MessageCheck");
XElement MessageBody = xDoc.Element("Receipts");
هل كانت مفيدة؟

المحلول

النظرية هي أن معنى المستند لا يتأثر باختيار المستخدم لبادئات مساحة الاسم.طالما أن البيانات موجودة في مساحة الاسم http://www.secretsonline.gov.uk/secrets ، لا يهم ما إذا كان المؤلف يختار استخدام البادئة "s" أو "secrets" أو "_x.cafe.babe" أو البادئة "null" (أي جعلها مساحة الاسم الافتراضية).لا يجب أن يهتم تطبيقك: ما يهم فقط URI.لهذا السبب يجب على تطبيقك تحديد URI.

نصائح أخرى

كما هو مقترح من خلال هذه الإجابة ، يمكنك القيام بذلك عن طريق إزالة جميع مساحات الأسماء من النسخة الموجودة في الذاكرة.أفترض أن هذا يجب أن يتم فقط إذا كنت تعلم أنه لن يكون هناك تضارب في الأسماء في المستند الناتج. Genacodicetagpre

يمكنك استخدام XmlTextReader.Namespaces لتعطيل مساحات الأسماء أثناء قراءة ملف XML.

Genacodicetagpre

هذه هي الطريقة التي يعمل بها Linq-To-Xml.لا يمكنك العثور على أي عنصر ، إذا لم يكن في مساحة الاسم الافتراضية ، وينطبق الشيء نفسه على العناصر المتفرعة منه.أسرع طريقة للتخلص من مساحة الاسم هي إزالة الارتباط إلى مساحة الاسم من XML الأولي الخاص بك.

لاحظ أن العنصر Receipts هو أيضا في مساحة الاسم http://www.secretsonline.gov.uk/secrets, ، وبالتالي فإن XNamespace سيكون مطلوبا أيضا للوصول إلى العنصر:

XElement MessageBody = xDoc.Element(ns + "Receipts");

كبديل لاستخدام مساحات الأسماء لاحظ أنه يمكنك استخدام" مساحة الاسم الملحد " زباث باستخدام local-name() و namespace-uri(), ، على سبيل المثال.

/*[local-name()='SomeElement' and namespace-uri()='somexmlns']

إذا قمت بحذف namespace-uri المسند:

/*[local-name()='SomeElement']

سوف تطابق ns1:SomeElement و ns2:SomeElement الخ.المنظمة البحرية الدولية وأود أن تفضل دائما XNamespace حيثما كان ذلك ممكنا ، وحالات الاستخدام لمساحة الاسم-الملحد زباث محدودة جدا ، على سبيل المثال.لتحليل عناصر محددة في المستندات ذات المخططات غير المعروفة (على سبيل المثال.أو تحليل أفضل جهد للمستندات حيث يمكن تغيير مساحة الاسم (على سبيل المثال.التدقيق في المستقبل ، حيث xmlns التغييرات لمطابقة إصدار جديد من مخطط المستند)

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