سؤال

لدي XML التالي وأنا أحاول أحفاد().فمنهم().فمنهم لاسترداد عنصر القيمة ولكن لا أستطيع الحصول على عمل.

أريد أن أعود القيمة الأولى وجدت في العنصر الأول من PersonID.

هو سلسلة لذا أنا أفعل هذا:

XDocument XDoc = XDocument.Parse(XmlString);

    <Root>
<Code>200001</Code>
<MsgType>106</MsgType>
<PersonData>
<MSG>
<NewDataSet xmlns="PersonInstances">
      <PersonInstances>
        <PersonInstanceId>1</PersonInstanceId>
        <PersonId>400</PersonId>
        <Status>210005</Status>
        <DateChanged>2009-10-20T11:53:00+01:00</DateChanged>
      </PersonInstances>
      <PersonInstances>
        <PersonInstanceId>2</PersonInstanceId>
        <PersonId>400</PersonId>
        <Status>210005</Status>
        <DateChanged>2009-10-20T12:13:00+01:00</DateChanged>
      </PersonInstances>
      <PersonInstances>
        <PersonInstanceId>3</PersonInstanceId>
        <PersonId>400</PersonId>
        <Status>210005</Status>
        <DateChanged>2009-10-20T15:28:00+01:00</DateChanged>
      </PersonInstances>
      <PersonInstances>
        <PersonInstanceId>4</PersonInstanceId>
        <PersonId>400</PersonId>
        <Status>210005</Status>
        <DateChanged>2009-10-20T15:32:00+01:00</DateChanged>
      </PersonInstances>
      <PersonInstances>
        <PersonInstanceId>5</PersonInstanceId>
        <PersonId>400</PersonId>
        <Status>210005</Status>
        <DateChanged>2009-10-21T10:49:00+01:00</DateChanged>
      </PersonInstances>
      <PersonInstances>
        <PersonInstanceId>6</PersonInstanceId>
        <PersonId>400</PersonId>
        <Status>210005</Status>
        <DateChanged>2009-10-21T17:15:00+01:00</DateChanged>
      </PersonInstances>
      <PersonInstances>
        <PersonInstanceId>7</PersonInstanceId>
        <PersonId>400</PersonId>
        <Status>210005</Status>
        <DateChanged>2009-10-22T10:06:00+01:00</DateChanged>
      </PersonInstances>
      <PersonInstances>
        <PersonInstanceId>8</PersonInstanceId>
        <PersonId>400</PersonId>
        <Status>210005</Status>
        <DateChanged>2009-10-22T16:01:00+01:00</DateChanged>
      </PersonInstances>
    </NewDataSet></MSG></PersonData></Root>
هل كانت مفيدة؟

المحلول

في الواقع ما تقومون به خطأ هو أنت وليس بما في ذلك مساحات إلى جلب كود :

var el = (element.Descendants(XNamespace.Get("PersonInstances") +
"PersonId").FirstOrDefault()).Value;

استخدام هذا العمل.

ولكن اسمحوا لي أن أقدم لكم معلومات مختصرة عن مساحات :

<Persons xlmns="something">
 <Person>
  <Name>John</Name>
 </Person>
</Person>

في هذا المثال مساحة ينطبق على جميع أحفاد ولكن إذا كنت ترغب في استبعاد بعض من أحفاد

<Persons xlmns="something">
 <Person>
  <Name>John</Name>
  <LastName xmlns="">Usher</LastName>
 </Person>
</Person>

الآن هذه المرة LastName سيتم استبعاد من هذا الاسم (شيء)

ولكن إذا كان من الصعب بالنسبة لك ثم يمكنك استخدام البادئات أن تفعل نفس الشيء مع مشاحنات أقل :

<pre:Persons xlmns:pre="something">
 <pre:Person>
  <pre:Name>John</Name>
 </Person>
</Person>

ولكن إذا كنت تريد أن تشمل جميع أحفاد في هذا الاسم الفضاء يجب عليك استخدام البادئة في جميع أحفاد كما هو موضح في المثال أعلاه صحيح

إذا كنت ترغب في استبعاد بعض العناصر من ذلك :

<pre:Persons xlmns:pre="something">
 <Person>
  <pre:Name>John</Name>
 </Person>
</Person>

ثم ببساطة إزالة البادئة, هذا كل شيء.

يمكنك أيضا أن تفعل نفس الشيء بالنسبة سمات :

<pre:Persons xlmns:pre="something">
 <pre:Person>
  <pre:Name pre:Value="Yahoo">John</pre:Name>
 </Person>
</Person>

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

نصائح أخرى

 XDocument XDoc = XDocument.Parse(xfile);
 XNamespace ns = "PersonInstances";
 if (XDoc.Root.Descendants(ns + "PersonId").Any())
 {
    Console.Write(XDoc.Root.Descendants(ns + "PersonId").First().Value);
 }
 else
 {
    Console.Write("Fail");
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top