Pergunta

Eu tenho o seguinte XML e eu tenho tentado Descendents (). Descendents (). Descendents para recuperar um valor de elemento, mas não posso fazê-lo funcionar.

Eu quero retornar o primeiro valor encontrado no primeiro elemento de PersonID.

É uma cadeia assim que eu estou fazendo isso:

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>
Foi útil?

Solução

Na verdade o que você está fazendo errado é que você não está incluindo espaços de nomes para o seu código de fetch:

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

Use isso, ele vai funcionar.

Mas deixe-me dar-lhe uma breve informação sobre namespaces:

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

Neste exemplo namespace se aplica a todos os descendentes, mas se você quiser excluir alguns dos descendentes

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

Agora, desta vez LastName será excluído deste namespace (algo)

Mas se é difícil para você, então você pode usar prefixos de fazer mesma coisa com menos problemas:

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

Mas se você quiser incluir todos os descendentes para este espaço nome que você deve usar o prefixo dentro de todos os descendentes como mostra o exemplo logo acima

Se você quiser excluir alguns elementos a partir dele:

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

Em seguida, basta remover o prefixo, é isso.

Você também pode fazer a mesma coisa para os atributos:

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

E se assim é preciso indicar o namespace dentro de seu código cada vez que você deseja obter algo que tem um namespace.

Outras dicas

 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");
 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top