Проблема с XmlReader
Я никогда не использовал XML много, и мне нужна помощь в чтении сложного файла.
Я пытаюсь добраться до числа, которое вложено в: outputTree\command\heading\pivotTable\ измерение \ категория \ измерение \ категория \ измерение \ группа \ категория \call:Text(число)
Я просто понятия не имею, как это сделать. если бы кто-нибудь мог показать мне некоторые основы этого, было бы полезно, чтобы все примеры, которые я вижу, были очень простыми и не имели такого количества уровней, поэтому у меня возникают проблемы с пониманием того, как добраться до этого уровня.
благодарю вас.
3 ответа
Вы можете использовать запрос XPath. Основываясь на структуре вашего документа, это должно поймать вас точное значение, которое вы ищете:
var xml = XDocument.Load(@"c:\path\to\file.xml");
var nsManager = new XmlNamespaceManager(new NameTable());
nsManager.AddNamespace(
"oms",
"http://www.ibm.com/software/analytics/spss/xml/oms");
var cell = xml.XPathSelectElement(
"oms:outputTree/oms:command[@text='Regression']/" +
"oms:heading[@text='uid = 1015984.00']/" +
"oms:pivotTable[@text='Coefficients']/" +
"oms:dimension/oms:category/oms:dimension/oms:category/" +
"oms:dimension/oms:group/oms:category/oms:cell",
nsManager);
var number = (decimal)cell.Attribute("number");
Console.WriteLine(number);
Твик по мере необходимости. Вам понадобится этот импорт:
using System.Xml.Linq;
using System.Xml.XPath;
Как и в этом ответе, вы можете выбрать узел XML напрямую, используя расширенный фильтр XPath.
такие как:
var document = new XmlDocument();
document.Load("<fileName>");
XmlNode node = document.SelectSingleNode("outputTree/command/heading[@text='uid = 1015984.00']/pivotTable[@text='Coefficients']/dimension[@text='Model']");
и т.п.
см. список примеров: http://msdn.microsoft.com/en-us/library/ms256086(v=vs.110).aspx
Я думаю, что в конечном итоге сделаю это и добавлю несколько операторов if, чтобы поймать данные, которые я ищу:
XmlTextReader reader = new XmlTextReader("c:/temp/descriptives_table.xml");
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // The node is an element.
Console.Write("<" + reader.Name);
while (reader.MoveToNextAttribute()) // Read the attributes.
Console.Write(" " + reader.Name + "='" + reader.Value + "'");
Console.WriteLine(">");
break;
case XmlNodeType.Text: //Display the text in each element.
Console.WriteLine(reader.Value);
break;
case XmlNodeType.EndElement: //Display the end of the element.
Console.Write("</" + reader.Name);
Console.WriteLine(">");
break;
}
}
Спасибо за вашу помощь! и ведет меня на этот путь!