У меня есть код, который анализирует XML, который выглядит следующим образом:
<custom_fields>
<custom_field>
<column_name>foo</column_name>
<column_value>0</column_value>
<description>Submitted</description>
<data_type>BOOLEAN</data_type>
<length>0</length>
<decimal>0</decimal>
</custom_field>
<custom_field>
<column_name>bar</column_name>
<column_value>0</column_value>
<description>Validated</description>
<data_type>BOOLEAN</data_type>
<length>0</length>
<decimal>0</decimal>
</custom_field>
</custom_fields>
... more <custom_field> elements...
Я хочу найти элемент с именем custom_field
, у которого есть дочерний элемент с именем column_name
с определенным значением (например, bar
), а затем найти брата этого дочернего элемента с именем column_value
и получить его значение. Прямо сейчас я использую XPath на XMlDocument
, чтобы сделать это:
string path = "//custom_fields/custom_field[column_name='" + key + "']";
XmlNode xNode = doc.SelectSingleNode(path);
if (xNode != null)
{
XmlNode v = xNode.SelectSingleNode("column_value");
val.SetValue(v.InnerText);
}
Где key
- это название поля, которое я ищу.
Но я хочу сделать это, используя новый синтаксис LINQ to XML на XDocument
. Я думаю, что большую часть своего анализа XPath старого стиля перенесу на методы LINQ. Возможно, это не очень хорошая идея, но это тот случай, когда, если я смогу заставить его работать, то, я думаю, у меня будет намного лучшее понимание LINQ в целом, и я смогу очистить много сложного кода.