#c# #.net #xml
#c# #.net #xml
Вопрос:
У меня есть следующий код, который я использую для обхода XML:
private void btn_readXML_Click(object sender, EventArgs e)
{
var doc = new XmlDocument();
doc.Load("e:\contacts.xml");
// Load xml document.
TraverseNodes(doc.ChildNodes);
}
static List<string> xmlnodes = new List<string>();
private static void TraverseNodes(XmlNodeList nodes)
{
foreach (XmlNode node in nodes)
{
List<string> temp = new List<string>();
temp.Add("Node name: " node.Name.ToString());
XmlAttributeCollection xmlAttributes = node.Attributes;
foreach (XmlAttribute at in xmlAttributes)
{
temp.Add(" Atrib: " at.Name ": " at.Value);
}
xmlnodes.AddRange(temp);
TraverseNodes(node.ChildNodes);
}
Но моя проблема в том, что я не хочу просматривать весь документ, я хочу только просмотреть узел, а затем его дочерние элементы, у которых есть атрибут ‘X’. Пожалуйста, обратите внимание, что я не знаю, где присутствует узел. Итак, в основном, что мне нужно сделать, это выяснить, существует ли узел (у него будет атрибут ‘X’. Вот как я определяю его правильный узел) если да, то извлеките его дочерние элементы.
Кто-нибудь может мне здесь помочь? Я довольно новичок в XMLS. Заранее спасибо!
Комментарии:
1. Вы знаете
XPath
? Вы могли бы использоватьSelectSingleNode
илиSelectNodes
класса XmlDocument.2. Я не уверен, что знаю XPath полностью, но я попробовал его фрагмент. Я не знаю, где находится узел. Я не могу указать такой путь.
3. Я обновил ответ. Вы можете выбрать все элементы в документе, имеющие атрибут
X
.
Ответ №1:
Предполагая, что ваш XML имеет следующую структуру:
<Contacts>
<Contact X="abc">
<Child1></Child1>
</Contact>
<Contact X="def">
<Child2></Child2>
</Contact>
</Contacts>
Пример кода с использованием XmlNode.SelectNodes:
var doc = new XmlDocument();
doc.Load("e:\contacts.xml");
//get root element of document
XmlElement root = doc.DocumentElement;
//select all contact element having attribute X
XmlNodeList nodeList = root.SelectNodes("//Contact[@X]");
//loop through the nodelist
foreach (XmlNode xNode in nodeList)
{
//traverse all childs of the node
}
Для различных запросов XPath см. Эту ссылку.
Обновить:
Если вы хотите выбрать все элементы, имеющие атрибут X
в документе. Неважно, где они существуют. Вы могли бы использовать следующее:
//select all elements in the doucment having attribute X
XmlNodeList nodeList = root.SelectNodes("//*[@X]");
Комментарии:
1. Да, все в порядке. Есть ли способ, которым я могу сделать что-то вроде: XmlNodeList NodeList = root . SelectNodes(«//Contact[@X]»)==»Y»; Я имею в виду, что здесь я даю имя атрибута. Могу ли я выбрать по значению атрибута?
2.
root.SelectNodes("//Contact[@X='Y']");
вы можете сделать так.
Ответ №2:
Попробуйте это:
private void btn_readXML_Click(object sender, EventArgs e)
{
var doc = new XmlDocument();
doc.Load("e:\contacts.xml");
var nodes = xdoc.SelectNodes("//yournodename");
// ex.
// var nodes = xdoc.SelectNodes("//Company");
TraverseNodes(nodes);
}