我正在编写一个读取XML(仅限元素)的程序,并将该值存储到数据库中。
但是XmlReader类中没有这样的方法来获取子节点的父节点的名称/值。 是否有任何解决方法或我应该使用任何其他解析器。
答案 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;
}
}
}