سؤال

أنا أعمل مع مستند XML يحتوي على بنية تشبه ما يلي:

<MT>
  <Events>
    <event id="1">
      <field name="blah" value="a_value" type="atype" />
      .
      .
      .
     </event>
   </Events>
 </MT>

أقوم حاليًا بتحميل هذا من ملف إلى مستند XML بهذه الطريقة:

XmlDocument xdoc = new XmlDocument();
xdoc.Load("somefile.xml");  //Successfully loads btw

ومع ذلك، فأنا أواجه مشكلة مع هذا المستند فقط عندما أحاول تشغيل السطر التالي من التعليمات البرمجية:

xdoc.SelectSingleNode("//event[@id='1']"); //This returns a null 

هل أنا على المسار الصحيح من خلال تخمين أن هذا يعود بقيمة فارغة بسبب مشكلة في استخدام سمة تسمى "المعرف" أو هل أفتقد شيئًا ما في الكود؟

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

المحلول

لا أستطيع تكرار هذا باستخدام ملف XML

<MT>
  <Events>
    <event id="1">
      <field name="blah" value="a_value" type="atype" />
     </event>
   </Events>
</MT>

والرمز

XmlDocument doc = new XmlDocument();
doc.Load(@"C:\test.xml");

XmlNode node = doc.SelectSingleNode("//event[@id='1']");

يؤدي هذا إلى إرجاع عقدة غير فارغة كما هو متوقع.

تحديث

بعد إضافة أ xmlns="example.org" إلى <MT> العنصر، اضطررت إلى تكوين مدير مساحة الاسم لـ XPath واستخدام مساحة الاسم للحدث.تعذر تشغيل مساحة الاسم الافتراضية لسبب ما.

XmlDocument doc = new XmlDocument();
doc.Load(@"D:\test.xml");

XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("e", "http://example.org");

XmlNode node = doc.SelectSingleNode("//e:event[@id='1']", manager);

شيء واحد أربكني عندما حاولت تشغيل هذا.لماذا يحتاج XmlNamespaceManager إلى XmlNameTable من المستند إن لم يكن لمعرفة مساحات الأسماء التي يحتوي عليها؟كما هو الحال في، لماذا أحتاج إلى تحديد NameTable و مساحة الاسم؟سأكون ممتنًا لو قام شخص يعرف بإسقاط تعليق قصير.

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