Развернуть node строку в XMLNodeList

Мне любопытно, какой был бы самый простой способ разобрать строку узлов xml в XmlNodeList. Например:

string xmlnodestr = "<mynode value1="1" value2="123">abc</mynode>
<mynode value1="1" value2="123">abc</mynode>
<mynode value1="1" value2="123">abc</mynode>";

Я мог бы сделать разделение строки в списке, но это было бы грязно и неприлично.

В идеале я хочу что-то вроде:

XmlNodeList xmlnodelist = xmlnodestr.ParseToXmlNodeList();

2 ответа

Вы можете добавить корень в свой XML, а затем использовать этот подход:

string xmlnodestr = @"<mynode value1="" 1""="" value2="" 123""="">abc</mynode><mynode value1="" 1""="" value2="" 123""="">abc</mynode><mynode value1="" 1""="" value2="" 123""="">abc</mynode>";
string xmlWithRoot = "<root>" + xmlnodestr + "</root>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlWithRoot);
XmlNodeList result = xmlDoc.SelectNodes("/root/*");
foreach (XmlNode node in result)
{
 Console.WriteLine(node.OuterXml);
}

Если вы можете использовать LINQ to XML, это будет намного проще, но вы не будете работать с XmlNodeList:

var xml = XElement.Parse(xmlWithRoot);
foreach (var element in xml.Elements())
{
 Console.WriteLine(element);
}


Вот пример программы, которая делает это с помощью XmlDocumentFragment, протестированного в .NET 2.0:

using System;
using System.Xml;
using System.Xml.XPath;
public class XPathTest
{
 public static void Main() {
 XmlDocument doc = new XmlDocument();
 string xmlnodestr = @"<mynode value1="1" value2="123">abc</mynode>
<mynode value1="1" value2="123">abc</mynode>
<mynode value1="1" value2="123">abc</mynode>";
 XmlDocumentFragment frag = doc.CreateDocumentFragment();
 frag.InnerXml = xmlnodestr;
 XmlNodeList nodes = frag.SelectNodes("*");
 foreach (XmlNode node in nodes)
 {
 Console.WriteLine(node.Name + " value1 = {0}; value2 = {1}",
 node.Attributes["value1"].Value,
 node.Attributes["value2"].Value);
 }
 }
}

Он производит следующий вывод:

mynode value1 = 1; value2 = 123
mynode value1 = 1; value2 = 123
mynode value1 = 1; value2 = 123

licensed under cc by-sa 3.0 with attribution.