Как выполнить итерацию по определенному xpath против XmlDocument
, у которого нет префикса/пространства имен ?
Я разбираю 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;
}
}
}
Как выполнить итерацию по определенному xpath против XmlDocument
, у которого нет префикса/пространства имен ?
@Crowcoder спасибо! но это означало бы, что я бы повторно реализовал. есть раствор бинта?
@BrootsWaymb «возможно» не оплачивать счета, вы говорите, что с xmldocument его невозможный игнорирует пространство имен?
Я действительно не знаю, я давно не использовал XmlDocument
.
Действительно, был способ сделать это с помощью 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);
}
Если вас вообще не волнуют пространства имен и вы хотите вместо этого использовать
System.Xml.Linq
, вы можете использовать локальное имя