【问题标题】:How to get parent element name using XmlReader in C#如何在 C# 中使用 XmlReader 获取父元素名称
【发布时间】:2014-11-12 10:24:46
【问题描述】:

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

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

【问题讨论】:

  • 你试过 XmlSerialization 吗?
  • 您是否需要使用XmlReader,因为XML 太大了?如果没有,我会直接使用 LINQ to XML。
  • @SandySands:没有迹象表明这是表示序列化对象的 XML。对于一般的 XML 文档,序列化不是一个好方法。
  • 我的程序的目标是读取xml(没有DTD/schema)动态创建表,并将值存储到表中。目前我正在从xml创建xsd(使用xsd.exe),使用xsd我手动创建表并使用我的程序将xml中的值存储到表中。您认为实现这一目标的最佳方法是什么?

标签: c# xml xml-parsing xmlreader


【解决方案1】:

由于 XmlReader 提供只进访问,因此至少不多次读取文档是不可能的。为什么不使用 Linq to XML?

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

【讨论】:

    【解决方案2】:

    也许检查 XmlReader.ReadSubtree 方法。它创建了一个新的 XmlReader,以便您可以从中获取子节点的信息,而无需将原始 XmlReader 移动到非常深的层次......

    【讨论】:

      【解决方案3】:

      正如MSDN 所说的 XmlReader:

      表示提供对 XML 数据的快速、非缓存、只进访问的阅读器

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

      【讨论】:

        【解决方案4】:

        如果您使用 .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;
                    }
                }
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-08
          • 1970-01-01
          • 2013-07-30
          相关资源
          最近更新 更多