2017-09-26 24 views
0

属性の値を取得するのが難しい。linqを使用している別の属性に基づいて要素のxml属性値を取得

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

私は 'fdtFieldName' 属性の値を取得しようとしている:ようなXMLを想定し

。 他の類似の質問に基づいて、私が試してみた:

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を考え出す続けます。何か案は?

+0

属性では、Valueプロパティを取得する必要はありませんか?値 –

+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

はあなたが私はあなたがそれの値を取得するために属性を使用する必要がfdtFieldNameの値を取得することができる午前しようとした。このように試すことができます。この1 svgDocument.root.Elements()

+0

が動作しません。:( – BMills

1

を試してみてください。デバッガを置けば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を使用して解決策を得ました。あなたの入力のおかげで私は私のソリューションを投稿しました。 n要素をループするのではなく、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を破壊しなければならないと思います。非常に単純化されたxmlでテストします。 – BMills

+0

xmlの例を教えていただけますか? –

関連する問題