【问题标题】:Trouble with XmlReaderXmlReader 的问题
【发布时间】:2013-11-22 15:13:23
【问题描述】:

我从来没有大量使用过 XML,在阅读复杂文件时需要一些帮助。

我正在尝试获取嵌套在以下位置的数字: outputTree\command\heading\pivotTable\dimension\category\dimension\category\dimension\group\category\call:Text(number)

我只是不知道该怎么做。 如果有人可以向我展示一些这方面的基础知识,那将会很有帮助,我看到的所有示例都是非常基础的并且没有这么多级别,所以我在理解如何达到这个级别时遇到问题。

谢谢。

【问题讨论】:

  • 您的麻烦究竟是什么性质的?你看过msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx的文档吗?
  • 我有,我对此感到困惑,我试图获取 XML 文档中的元素,但每次运行它时,我似乎永远找不到该元素数据。我相信我的要求很明确,我正在尝试解决这个问题,但我不知道该怎么做。
  • 我正在使用此代码读取文档:使用 (XmlReader reader = XmlReader.Create("c:/temp/descriptives_table.xml")) { reader.ReadStartElement("outputTree"); while (reader.Name == "category") { XElement el = (XElement)XNode.ReadFrom(reader); } reader.ReadEndElement(); }

标签: c# xml xmlreader


【解决方案1】:

this answer 一样,您可以使用高级 XPath 过滤器直接选择 XML 节点

如:

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

【讨论】:

  • 所以当我这样做时: XmlNode node = results.SelectSingleNode("/outputTree/command/heading/pivotTable[@text='Coefficients']");它返回 null
  • 尝试去掉 outputTree 之前的第一个“/”,并确保所有路径都匹配
  • 试过:XmlNode node = results.SelectSingleNode("outputTree/command/heading/pivotTable[@text='Coefficients']");仍然为空
  • 尝试过滤“标题”标签。可能还有其他“标题”元素。查看我的编辑。
  • 当您尝试选择可能有多个选择的 XPath 时,您应该确保通过过滤某些属性来选择您想要的确切路径。
【解决方案2】:

您可以使用XPath query。根据您文档的结构,这应该会为您找到您正在寻找的确切值:

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;

【讨论】:

  • 我在这里没有看到任何 LINQ to XML。
  • 单元格返回 null
  • @James XDocument 定义在 System.Xml.Linq 命名空间中,参见msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx
  • @user1221399 我没有在根元素中看到您的xmlns 属性。这可能是一个命名空间问题。让我看看并修改我的答案。
  • @user1221399 更新了命名空间限定符。出于某种原因,如果我将 OMS 命名空间映射为默认名称,它就不起作用了。
【解决方案3】:

我想我最终会这样做并添加一些 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;
                }
            }

感谢大家的帮助!并带领我走上这条路!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多