找不到嵌套后代Linq XElement

时间:2018-08-29 06:59:15

标签: c# xml linq

我试图接收具有给定标签名称的所有元素,无论它们在哪里。 我在基本元素上使用了Descendants()方法,如下所示:

public static XElement GetModifiedDataSource(XElement rechnung, string parentElement, string newElementTag, string value = null)
{
    foreach (var element in rechnung.Descendants(parentElement))
    {
        XElement newElement = new XElement(newElementTag);
        if (value != null)
        {
            newElement.SetValue(value);
        }
        element.Add(newElement);
    }
    return rechnung;
}

对于string parentElement = "Produkt"的示例,我应该收到多个。 样本:

<Schlussrechnung xmlns="http://someurl">
    <Parameter>
      <Version></Version>
    </Parameter>
    <Uebersicht>
      <Kopf>
        <Rechnungsempfaenger>
        </Rechnungsempfaenger>
      </Kopf>
      <Detail>
      </Detail>
    </Uebersicht>
    <AbrechnungsDetail>
      <Messpunkt>
        <Produktgruppe>
          <Produkt>
            HERE
          </Produkt>
          <Produkt>
            AND HERE
          </Produkt>
        </Produktgruppe>
      </Messpunkt>
  </Schlussrechnung>

2 个答案:

答案 0 :(得分:1)

您的XML具有默认名称空间,您的目标元素将从根元素继承:

xmlns="http://someurl"

您可以结合使用XNamespace和元素的本地名称来引用命名空间中的元素:

// you can make `ns` as additional parameter of `GetModifiedDataSource`
XNamespace ns = "http://someurl"; 
foreach (var element in rechnung.Descendants(ns+parentElement))
{
    ....
}

或者,如果存在从错误的名称空间获取元素的风险,则可以通过仅查看元素的本地名称来忽略名称空间:

foreach (var element in rechnung.Descendants().Where(o => o.Name.LocalName == parentElement)
{
    ....
}

答案 1 :(得分:1)

完成此操作的步骤:

  1. 获取像xp下的xElement下的元素中的所有后代元素

    var descendants = rechnung.Descendants()

  2. 使用linq之类的所有具有“ LocalName” =“ Produkt”的后代

    var getAllProdukt = descendants.ToList().Where(desc => desc.Name.LocalName == "Produkt").ToList();

这样,您将获得带有标签“ Produkt”的XElement列表