C#XML XDocument解析)如何知道具有特定孙值的特定祖先节点的名称



我试了几个小时,但没有具体的解决方案。XML解析和LINQ对我来说很复杂。

有人能帮我知道特定祖先节点的名称吗?其中包括具有特定值的孙节点?

有R1、R2、R3、R4……我想知道哪个R有值为201404418 的B7孙子

在我的例子中,祖先的名字不是重复的,而是有数字变量需要识别。

此外,为了利用已经下载的XDocument对象并提高性能,请仅使用XDocument。

<?xml version="1.0" encoding="utf-8"?>
<RESULT>
    <ITEM>
        <R1>
            <B DESC="product">
                <B1> chocolate </B1>
                <B2> white </B2>
                <B3> Kisses </B3>
                <B4> bar type </B4>
                <B5> 2 $ </B5>
                <B6>2014-09-26 </B6>
                <B7>201404418 </B7>
            </B>
            <C DESC="ingredient">
                <CR1>
                    <C1>cacao paste </C1>
                    <C2> concentrated </C2>
                    <C3> 21.69 </C3>
                    <C4> gram </C4>
                </CR1>
                <CR2>
                    <C1> strawberry cream </C1>
                    <C2> normal </C2>
                    <C3> 10 </C3>
                    <C4> gram </C4>
                </CR2>
                <CR3>
                    <C1> almond &amp; nut </C1>
                    <C2> dried product </C2>
                    <C3> 10 </C3>
                    <C4> gram </C4>
                </CR3>
            </C>
            <D DESC="basic informations of product">
                <D1>http://food.tfda.go.tn/html/bxmPdfViewer.jsp?docid=145977782405945000134</D1>
                <D2>http://food.tfda.go.tn/html/bxmPdfViewer.jsp?docid=145971282405945000164</D2>
                <D3>http://food.tfda.go.tn/html/bxmPdfViewer.jsp?docid=145979082424311500014</D3>
                <D6>http://www.food.tn/images/insert_pdf/IN_2014091700002_00.pdf</D6>
            </D>
            <E DESC="storage">
                <E1> room temperature </E1>
                <E2> 36 months from manufacturing date </E2>
                <E5> in-house packaging unit </E5>
                <E6> 1 $/unit </E6>
            </E>
            <F DESC="production record">
                <FR1>
                    <F1>2014</F1>
                    <F2>0</F2>
                    <F3>0</F3>
                    <F4>0</F4>
                    <F5>161,816</F5>
                    <F7>161,816</F7>
                </FR1>
                <FR2>
                    <F1>2015</F1>
                    <F2>469,591</F2>
                    <F3>466,147</F3>
                    <F4>473,315</F4>
                    <F5>612,964</F5>
                    <F7>2,022,017</F7>
                </FR2>
            </F>
            <G DESC="import record"></G>
        </R1>
    </ITEM>
</RESULT>

您可以使用LinqXml,查找具有匹配条件的元素并获取它的Parent

    XDocument doc =  XDocument.Load(filename);
    var parent = doc.Descendants()  
                    .Elements("B7") // look for element
                    .FirstOrDefault(x=>(string)x.Value == "201404418")
                    .Parent; // Parent.

检查此Demo

这将帮助您解决troubleshooting问题,并有望解决问题。

XML示例:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<record>
  <R1>
       <B DESC="product">
            <B1> chocolate </B1>
            <B2> white </B2>
            <B3> Kisses </B3>
            <B4> bar type </B4>
            <B5> 2 $ </B5>
            <B6>2014-09-26 </B6>
            <B7>201404418 </B7>
        </B>
  </R1>
</record>

这样的事情应该会让你走上正确的道路;

//Parse XML to XElement
var xmlObject = XElement.Parse(TypeOfBill2014); 
var result = xmlObject.Elements("B")
                 .Where(x => (string)x.Element("B7") == 201404418)
                 .Select(x => x.Parent)
                 .FirstOrDefault();

以下是的一些链接;

  • 如何从XML和LINQ开始
  • MSDN XElement
  • SO示例

供进一步阅读。

最新更新