如何针对不带前缀/命名空间的XmlDocument
遍历特定的xpath ?
我正在像这样解析XML:
var doc = new XmlDocument();
doc.LoadXml(input);
var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace(nsPrefix, ns);
var nodes = doc.SelectNodes(xpath, nsmgr);
当nsPrefix
和ns
传入且非空时,此方法完全正常。
但是,例如在这种情况下,当名称空间/前缀为空时:
然后,我无法正确解析XML。
完整功能是:
public static class XPathWalker
{
public static IEnumerable<string> GetListOfAttachments(string input, string xpath, string nsPrefix, string ns)
{
var doc = new XmlDocument();
doc.LoadXml(input);
var nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace(nsPrefix, ns);
var nodes = doc.SelectNodes(xpath, nsmgr);
foreach (XmlNode node in nodes)
{
if (string.IsNullOrWhiteSpace(node.InnerText))
{
continue;
}
yield return node.InnerText;
}
}
}
如何针对不带前缀/命名空间的XmlDocument
遍历特定的xpath ?
答案 0 :(得分:0)
确实有一种使用XmlDocument
的方法。首先,我必须将输入string
转换为stream
:
// convert string to stream
byte[] byteArray = Encoding.UTF8.GetBytes(input);
MemoryStream stream = new MemoryStream(byteArray);
一旦有了stream
,我便可以将其输入XmlDocument
中。这是完整的代码:
string input = @"<?xml version="1.0" encoding="UTF-8"?>etc..";
byte[] byteArray = Encoding.UTF8.GetBytes(input);
var stream = new MemoryStream(byteArray);
var doc = new XmlDocument();
var nodes = doc.SelectNodes(xpath);
using (var tr = new XmlTextReader(stream))
{
tr.Namespaces = false;
doc.Load(tr);
}