Как бы мне ни хотелось использовать LINQ и XDocument
, в этом случае XPath проще.
Учитывая ваш XML, этот XPath находит все элементы VIPair
в элементе Pin
сданный Number
и элемент Curve
с заданным Type
:
/Document/Device/Pins/Pin[Number='A1']/Curves/Curve[Type='PreStress']/VIPairs/VIPair
Используя XmlDocument
, код для получения трех значений напряжения и тока будет выглядеть следующим образом:
string number = "A1";
string type = "PreStress"
string xpath = string.Format(
"/Document/Device/Pins/Pin[Number='{0}']/Curves/Curve[Type='{1}']/VIPairs/VIPair",
number,
type);
foreach (XmlElement viPair in doc.SelectNodes(xpath))
{
string current = viPair.SelectSingleNode("Current").Value;
string voltage = viPair.SelectSingleNode("Voltage").Value;
}
Используя XDocument, код будет выглядеть следующим образом:
var values = doc.XPathSelectElements(xpath)
.Select(x => new { Voltage = x.Element("Voltage").Value(),
Current = x.Element("Current").Value() });
Если ваш документ не был предварительно проверен на соответствие схеме, вы можете захотеть выполнить последний тест узла в XPath VIPair[Current and Voltage]
, чтобы код не завершился ошибкой, если в элементе VIPair
отсутствует один из этих дочерних элементов.(В качестве альтернативы вы можете на самом деле хотеть код, выдавший исключение, если это произойдет; это действительно зависит от качества исходных данных.)