如何从LINQ to XML中的XElement读取特定元素值

时间:2012-06-01 04:23:15

标签: c#-4.0 linq-to-xml xelement

我有一个XElement,其中包含这样的内容。

<Response xmlns="someurl" xmlnsLi="thew3url">
   <ErrorCode></ErrorCode>
   <Status>Success</Status>
   <Result>
       <Manufacturer>
            <ManufacturerID>46</ManufacturerID>
            <ManufacturerName>APPLE</ManufacturerName>
       </Manufacturer>
      //More Manufacturer Elements like above here
   </Result>
</Response>

我如何读取Status元素中的值?

我试过了XElement stats = myXel.Descendants("Status").SingleOrDefault();但是返回了null。

3 个答案:

答案 0 :(得分:5)

如果myXel已经是响应XElement,那么它将是:

var status = myXel.Elements().Where(e => e.Name.LocalName == "Status").Single().Value;

您需要使用LocalName来忽略名称空间。

答案 1 :(得分:4)

XElement response = XElement.Load("file.xml"); // XElement.Parse(stringWithXmlGoesHere)
XNamespace df = response.Name.Namespace;
XElement status = response.Element(df + "Status");

应该足以访问Status子元素。 如果您希望该元素的值为字符串,则执行例如。

string status = (string)response.Element(df + "Status");

答案 2 :(得分:0)

一些TextReader知道很快就会有更多数据,但不是现在所有字符都可用。如果您要求输入10个字符,而现在只有4个字符,但是其他字符将在几秒钟后变为可用,那么最好返回4个可用字符,而不是等待所有10个字符。

一个示例可能是TextReader,它缓冲来自串行端口的数据:等待所有请求的字符都可用将太慢,因此它将返回当前已经可用的所有字符。

您可以在返回值的说明中看到TextReader.Read(char[], int, int)TextReader.ReadBlock(char[], int, int)之间的区别:

TextReader.Read

  

返回:   已读取的字符数;如果在流的末尾,则为0   并且没有读取任何数据。该数字将小于或等于count参数,   取决于数据流中是否可用。

TextReader.ReadBlock

  

返回:   已读取的字符数。该数字将小于或   等于计数,取决于是否已读取所有输入字符。

如果您要求TextReaderRead 10个字符,如果读者认为等待所有10个字符是不明智的,则允许Read返回少于10个字符。只要读者知道仍然有字符,它将等待至少一个字符。如果Read返回读取的4个字节,则您不知道是否已读取最后一个字符。仅当Read返回零时,您才知道不再需要阅读任何内容。这样,TextReader可以返回当前可用的字符,而不必等待所有10个字符都可用。

ReadBlock将等待所有10个字节可用(或EOF)。因此,阅读速度较慢的读者可能会比预期所需的时间更长。

为确保已读取所有字符,请重复使用'Read repeatedly until you get a zero return; Use ReadBlock`,直到读取的字节数少于要求的字节数为止。