尝试使用LINQ在XML文件中检索值

时间:2018-10-26 14:45:17

标签: c# xml linq-to-xml

我是LINQ的新手,我正试图从提供的<MM109>123456789</NM109>文件中获取值XML。我该怎么做?下面也是一些我认为正确的LINQ语法。

<?xml version="1.0"?>
<Interchange>
    <ISA>
    </ISA>
    <FunctionGroup>
        <GS>
        </GS>
        <Transaction ControlNumber="12345">
            <ST>
            </ST>
            <BHT>
            </BHT>
            <Loop LoopId="1000A" Name="SUBMITTER NAME">
                <NM1>
                </NM1>
                <PER>
                </PER>
            </Loop>
            <Loop LoopId="1000B" Name="RECEIVER NAME">
                <NM1>
                </NM1>
            </Loop>
            <HierarchicalLoop LoopId="2000A" LoopName="b p level" Id="1" ParentId="">
                <HL>
                </HL>
                <PRV>
                </PRV>
                <Loop LoopId="2010AA" Name="p name">
                    <NM1>
                        <NM109>987654321</NM109>
                    </NM1>
                    <N3>
                    </N3>
                    <N4>
                    </N4>
                    <REF>
                    </REF>
                    <PER>
                    </PER>
                </Loop>
            </HierarchicalLoop>
            <HierarchicalLoop LoopId="2000B" LoopName="SUBSCRIBER HIERARCHICAL LEVEL" Id="2" ParentId="1">
                <HL>
                </HL>
                <SBR>
                </SBR>
                <Loop LoopId="2010BA" Name="UserName">
                    <NM1>
                        <NM109>123456789</NM109>
                    </NM1>
                    <N3>
                    </N3>
                    <N4>
                    </N4>
                    <DMG>
                    </DMG>
                </Loop>
            </HierarchicalLoop>
        </Transaction>
    </FunctionGroup>
</Interchange>

如果我编写下面的代码,我可以获取所有NM109的值,但我想要的只是NM109元素的NM1子级中的Loop LoopId="2010BA" Name="UserName"。如何使用LINQ完成此操作?

XElement element = XElement.Load(fileName);
IEnumerable<XElement> transactions = element.Elements();

foreach (XElement xEle in element.Descendants("NM109"))
{
    Console.WriteLine(xEle);
}

1 个答案:

答案 0 :(得分:0)

通过此Linq查询,您可以获取具有给定ID的每个循环的后代,其父名称为NM1

foreach (XElement xEle in element.Descendants("Loop").FirstOrDefault(x => x.Attribute("LoopId").Value == "2010AA").Descendants("NM109").Where(x => x.Parent.Name == "NM1"))
{
     Console.WriteLine(xEle);
}