1

考虑以下 xml 文件:

<UPDATES xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<EXAMPLES>
    <EXAMPLE>
        <EXAMPLEID>1234</EXAMPLEID>
        <TYPES>
            <TYPE>
                <TYPEID>0</TYPEID>
                <FILES>
                    <FILE>
                        <FILENAME>fileName1</FILENAME>
                        <URL>http://somehwere</URL>
                        <MD5>2d774faa197fe87a49db0709048b82f0</MD5>
                    </FILE>
                    <FILE>
                        <FILENAME>fileName2</FILENAME>
                        <URL>http://somehwere</URL>
                        <MD5>1232132135a4dfseaf321daf51eaf321</MD5>
                    </FILE>
                </FILES>
            </TYPE>
        </TYPES>
    </EXAMPLE>
    <EXAMPLE>
        <EXAMPLEID>5678</EXAMPLEID>
        <TYPES>
            <TYPE>
                <TYPEID>0</TYPEID>
                <FILES>
                    <FILE>
                        <FILENAME>fileName3</FILENAME>
                        <URL>http://somehwere</URL>
                        <MD5>1232132135a4dfseaf321daf51eaf321</MD5>
                    </FILE>
                    <FILE>
                        <FILENAME>fileName4</FILENAME>
                        <URL>http://somehwere</URL>
                        <MD5>1232132135a4dfseaf321daf51eaf321</MD5>
                    </FILE>
                </FILES>
            </TYPE>
        </TYPES>
    </EXAMPLE>
</EXAMPLES>

我想提取文件名和 md5,但只针对一个特定的 exampleid。

到目前为止,要提取我想要的信息:

var files = xDocument.Descendants("FILE")
                                 .Select(
                                     node => new {FileName = node.Element("FILENAME"), Hash = node.Element("MD5")})
                                 .Distinct();

这将返回包含标签的信息。如果我做一个 node.Element("FILENAME").Value 我得到一个空引用异常..

它正在尝试添加我遇到问题的 Where 子句。

我将如何指定我只想返回与 exampleid 1234 关联的文件名和 md5?

4

1 回答 1

1

使用节点转换而不是直接访问值。如果未找到节点,您将在读取 Value 属性时获得 NullReference 异常。但是在将节点转换为字符串或可为空类型时,您只会得到 null。这是完整的查询:

var files = from e in xDocument.Descendants("EXAMPLE")
            where (int)e.Element("EXAMPLEID") == exampleId
            from f in e.Descendants("FILE") // get files of particular example
            select new {
                FileName = (string)f.Element("FILENAME"),
                Hash = (string)f.Element("MD5")
            };

例如,等于5678它返回的 exampleId:

{ FileName = fileName3, Hash = 1232132135a4dfseaf321daf51eaf321 }
{ FileName = fileName4, Hash = 1232132135a4dfseaf321daf51eaf321 }

与流利的语法相同:

var files = xDocument.Descendants("EXAMPLE")
                     .Where(e => (int)e.Element("EXAMPLEID") == exampleId)
                     .Descendants("FILE")
                     .Select(f => new {
                         FileName = (string)f.Element("FILENAME"),
                         Hash = (string)f.Element("MD5")
                     });
于 2013-09-04T14:08:56.830 回答