تحليل زدوكومنت دون الحاجة إلى الاستمرار في تحديد مساحة الاسم الافتراضية
-
29-10-2019 - |
سؤال
لدي بعض بيانات شمل (على غرار العينة أدناه) وأريد قراءة القيم في التعليمات البرمجية.
لماذا أجبر على تحديد مساحة الاسم الافتراضية للوصول إلى كل عنصر?كنت أتوقع استخدام مساحة الاسم الافتراضية لجميع العناصر.
هل هناك طريقة أكثر منطقية لتحقيق هدفي?
عينة شمل:
<?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
التغييرات لمطابقة إصدار جديد من مخطط المستند)