繁体   English   中英

使用linq根据另一个属性获取元素的xml属性值

[英]get xml attribute value of element based on another attribute using 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。 有任何想法吗?

您可以尝试这样,我已经尝试过我能够获取fdtFieldName的值,您必须使用attribute来获取它的值。 如果您放置调试器,您将对如何在xml中获取每个想要的值有一个清晰的认识

XmlDocument doc = new XmlDocument();
doc.LoadXml("your xml");
string attr = doc.DocumentElement.Attributes["fdtFieldName"]?.InnerText;

或者您可以像这样检查一下,如果您擅长ling则将其转换可能不会太长

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);
      }
  }
}

我认为您正在寻找:

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");

最后,我用xml reader实现了我的目标:

     string firstName; 
     XmlReader xmlReader = XmlReader.Create(new System.IO.StringReader(rpd.formmodeler));
     while (xmlReader.Read())
     {
      if ((xmlReader.NodeType == XmlNodeType.Element) && (xmlReader.Name == "g"))
         {
             var firstNameElement = xmlReader.GetAttribute("fdtLorenzoField");
                if (firstNameElement == "lzoFnm")
                     {
                       firstName = xmlReader.GetAttribute("fdtFieldName");
                     }
            }
    }

我不确定大型xml文档的性能是否会变差,但是我会看看效果如何。

试试这个svgDocument.root.Elements()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM