如何在c#中找到两个节点之间的字符串?

时间:2018-03-02 15:34:06

标签: c# linq-to-xml

如何在具有连续属性值的两个相同节点之间获取内容(或执行某种检查)。以下面的示例xml文件

<items>
    <item id="0001" type="donut">
        <name>Cake</name>
        <ppu>0.55</ppu>
        <batters>
            <batter id="1001">Regular</batter> is good <ax>1023</ax> and <batter id="1002">Chocolate</batter> or maybe <batter id="1003">Blueberry</batter>
        </batters>
        <topping id="5001">None</topping>
        <topping id="5002">Glazed</topping>
        <topping id="5005">Sugar</topping>
        <topping id="5006">Sprinkles</topping>
        <topping id="5003">Chocolate</topping>
        <topping id="5004">Maple</topping>
    </item>
    ...
</items>

如何使用linq-to-xml获取节点<batter id="...">与下一个<batter id="...">之间的内容,即is good <ax>1023</ax> andor maybe

1 个答案:

答案 0 :(得分:1)

假设您只想获取所有子节点但按条件忽略节点(元素名称为&#34; batter&#34;在您的情况下),则所有子节点上的基本Where条件将执行:

string s = @"<items>
    <item id='0001' type='donut'>
        <name>Cake</name>
        <ppu>0.55</ppu>
        <batters>
           <batter id='1001'>Regular</batter> is good <ax>1023</ax> and <batter id='1002'>Chocolate</batter> or maybe <batter id='1003'>Blueberry</batter>
           </batters>
        <topping id='5001'>None</topping>
        <topping id='5002'>Glazed</topping>
        <topping id='5005'>Sugar</topping>
        <topping id='5006'>Sprinkles</topping>
        <topping id='5003'>Chocolate</topping>
        <topping id='5004'>Maple</topping>
    </item>
</items>";

var yourNodes = XDocument.Parse(s)
   .Descendants("batters").Nodes()
   .Where(a=> 
       a.NodeType == XmlNodeType.Text || // take all text nodes
       // or elements that are not "batter".
       (a.NodeType == XmlNodeType.Element && ((XElement)a).Name 
!= "batter"));

string concatenated = yourNodes.Select(a=>a.ToString()).Aggregate((a,b)=>a+b);