簡體   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