Проблема с 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;
                }
            }

Спасибо за вашу помощь! и ведет меня на этот путь!

Другие вопросы по тегам