2017-09-26 60 views
0

检索属性的值时遇到一些困难。获取基于使用linq的另一个属性的元素的xml属性值

假设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来了空。有任何想法吗?

+0

在属性中,您不需要获取Value属性? x.Attribute(“fdtLorenzoField”)值 –

+1

使用后代(“g”)而不是元素(“g”) – jdweng

+0

这两个想法都不起作用:( – BMills

回答

0

最终我实现了我的目标与XML阅读:

 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文档表现不佳,但我会看看怎么回事。

-1

试试这个 svgDocument.root.Elements()

+0

不起作用:( – BMills

1

你可以尝试这样的我试过,我能够让你必须使用得到它的价值属性fdtFieldName的价值。如果你把调试器U将是具有如何让每一个你的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); 
     } 
    } 
} 
+0

这看起来很有趣,因为其他解决方案都不适用于我,但首先我需要找到包含属性fdtLorenzoField =“lzoFnm”的元素,一旦找到该元素,然后查找“fdtFieldName”的值。用xmlDocument实现这一点? – BMills

+0

非常感谢你的回答,它并没有完成这项工作,因为它只是让我成为根元素,而我需要为该属性查询多个子元素(“g”)。在正确的轨道上,我得到了一个解决方案使用xmlreader。谢谢你的输入。我已经发布了我的解决方案,所以如果你要适应你的答案和我的xmlreader解决方案一样工作, ñ我会将你的标记标记为正确的,因为我更喜欢将文档加载到1中而不是循环遍历元素。 – BMills

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

我认为我的XML必须打破,因为这看起来应该可以工作,但事实并非如此。我会用一些非常简化的xml来测试它。 – BMills

+0

你能提供一个你的xml的例子吗? –

相关问题