如何在C#中使用XmlReader获取父元素名称

时间:2014-11-12 10:24:47

标签: c# xml xml-parsing xmlreader

我正在编写一个读取XML(仅限元素)的程序,并将该值存储到数据库中。

但是XmlReader类中没有这样的方法来获取子节点的父节点的名称/值。 是否有任何解决方法或我应该使用任何其他解析器。

4 个答案:

答案 0 :(得分:1)

由于XmlReader提供仅向前访问,因此至少不能多次读取文档是不可能的。为什么不将Linq用于XML?

var xml = XElement.Load(xmlReader);
var element = xml.Descendants("someElement").First();
var parent = element.Parent;

答案 1 :(得分:0)

正如MSDN所说的关于XmlReader:

  

代表提供对XML数据的快速,非缓存,仅向前访问的读者

Сonsidering,XMLReader更适合处理大型XML。如果是这种情况,则需要在移动到处理嵌套节点之前存储有关父节点的信息。但是,如果您使用小型XML,那么最好选择处理节点是LINQ to XML(正如@Juriewicz Bartek建议的那样),这使得相关导航变得更容易。

答案 2 :(得分:0)

也许检查XmlReader.ReadSubtree方法。它创建一个新的XmlReader,以便您可以派生子节点'来自它的信息,而不是将原始的XmlReader移动到更深层......

答案 3 :(得分:0)

如果您使用的是.Net Framework,并且不担心将来的问题,因此继续使用.NET 4.8,则可以使用反射:

    static void Main(string[] args)
    {
        var xml = @"<document><node1>my text</node1>/document>";
        var reader = XmlReader.Create(new StringReader(xml));
        var nodesInfo = reader.GetType().GetField("nodes", BindingFlags.NonPublic | BindingFlags.Instance| BindingFlags.FlattenHierarchy);
        dynamic nodes = nodesInfo.GetValue(reader);
        while (reader.Read())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    {
                        switch (reader.Depth)
                        {
                            case 1:
                                var node = nodes[reader.Depth - 1];
                                var localNameInfo = node.GetType().GetField("localName", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
                                var localName = (string) localNameInfo.GetValue(node);
                                Console.WriteLine("Parent node = " + localName);
                                return;
                        }
                    }
                    break;
            }
        }
    }