使用linq获取基于另一个属性的元素的xml属性值

时间:2017-09-26 10:16:49

标签: c# xml linq

在检索属性值时遇到一些困难。

假设xml看起来像:

<g id="formSide1Main" class="formSideMain">
     <g  fdtFieldName="Forename1"  fdtLorenzoField="lzoFnm">
     .....

我正在尝试检索'fdtFieldName'属性的值。 根据其他类似的问题,我试过了:

var svgDocument = XDocument.Parse(rpd.formmodeler);
var firstName = svgDocument.Elements("g")
                .Where(x => (string)x.Attribute("fdtLorenzoField") == "lzoFnm").FirstOrDefault();

 var attrVal = firstName?.Attribute("fdtFieldName").Value;  

但是firstName一直是null。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

你可以尝试这样我曾尝试过我能够获得fdtFieldName的值你必须使用属性来获取它的值。如果您放置调试器,您将清楚地了解如何在xml

中获取所需的每个值
XmlDocument doc = new XmlDocument();
doc.LoadXml("your xml");
string attr = doc.DocumentElement.Attributes["fdtFieldName"]?.InnerText;

或者你可以像这样检查一下,如果你擅长灵活只是转换它可能会有点冗长

XmlDocument doc = new XmlDocument();
doc.LoadXml(txtQuery.Text);
DisplayNodes(doc.DocumentElement);

 private static void DisplayNodes(XmlNode node)
 {
  //Print attributes of the node
  if (node.Attributes != null)
   {
     XmlAttributeCollection attrs = node.Attributes;
     string value = string.Empty;
     foreach (XmlAttribute attr in attrs)
     {
       if (attr.Name == "fdtLorenzoField")
           value = attrs["fdtFieldName"]?.InnerText;

       Console.WriteLine("Attribute Name: fdtFieldName, Attribute Value = " + value);
      }
  }
}

答案 1 :(得分:0)

我认为你在寻找:

var firstName = svgDocument.Descendants("g").FirstOrDefault(x =>
 x.Attribute("fdtLorenzoField").Value == "lzoFnm");

或者,如果您关心节点的嵌套:

var firstName = svgDocument.Elements("g").FirstOrDefault()?.Elements("g").FirstOrDefault(x =>
 x.Attribute("fdtLorenzoField").Value == "lzoFnm");

答案 2 :(得分:0)

最后,我用xml阅读器实现了我的目标:

CFBundleVersion

我不确定这对于大型xml文档是否会有糟糕的表现,但我会看到它是如何发展的。

答案 3 :(得分:-1)

试试这个 svgDocument.root.Elements()