2009-10-22 51 views
2

我有以下XML,我一直在嘗試Descendents()。Descendents()。後代檢索元素值,但我無法讓它工作。返回元素值深入XDocument

我想返回在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> 

回答

8

其實你在做什麼錯誤是您不包括命名空間中的抓取代碼:

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> 

的現在這個時候姓氏將被排除在這個命名空間(東西)

但是,如果它是困難的,那麼你可以使用前綴做同樣的事情,少麻煩:

<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> 

如果是的話,你需要表明你的代碼中的命名空間,每次當你想要得到的東西,有一個命名空間。

0
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"); 
}