我有一个需要解析的XML字符串。
代码如下所示:
inputXML = "<elementList xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
<NodePrime>
<Node>
<NodeA>1</NodeA>
<NodeB>2</NodeB>
</Node>
<Node>
<NodeA>3</NodeA>
<NodeB>4</NodeB>
</Node>
</NodePrime>
</elementList>";
var ItemList = new List<ItemList>();
using(XmlReader Reader = XmlReader.Create(new StringReader(inputXML)))
{
Reader.read();
var doc = XDocument.Load(Reader);
var xmlnode = doc.Descendants("Node");
foreach(var item in xmlHeirarchy)
{
var ListA = new ItemList
{
itemA = item.Element("NodeA").Value;
itemB = item.Element("NodeB").Value;
};
ItemList.Add(ListA );
}
}
我的问题是doc.Descendants,因为我的xmlnode返回空。
请让我知道我做错了什么,以及最好的方法。
答案 0 :(得分:0)
您可以使用[subset(i), select(j)]
从字符串填充XDocument.Parse()
,这比您当前的方法更简单。那么XDocument
应该如下所示:
doc.Descendants("Node")
<强> dotnetfiddle demo
强>
输出
var inputXML = @"<elementList xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
<NodePrime>
<Node>
<NodeA>1</NodeA>
<NodeB>2</NodeB>
</Node>
<Node>
<NodeA>3</NodeA>
<NodeB>4</NodeB>
</Node>
</NodePrime>
</elementList>";
var ItemList = new List<ItemList>();
var doc = XDocument.Parse(inputXML);
var xmlnode = doc.Descendants("Node");
foreach(var item in xmlnode)
{
var ListA = new ItemList
{
itemA = item.Element("NodeA").Value,
itemB = item.Element("NodeB").Value
};
ItemList.Add(ListA );
}
Console.WriteLine(ItemList.Count());
答案 1 :(得分:0)
如果您有一个大文件,这就是我喜欢的方式。使用XmlTextReader比XmlReader使用更少的内存。唯一的区别是XmlReader允许在Xml中向后移动而XmlTextReader仅用于转发
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
string inputXML = "<elementList xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
"<NodePrime>" +
"<Node>" +
"<NodeA>1</NodeA>" +
"<NodeB>2</NodeB>" +
"</Node>" +
"<Node>" +
"<NodeA>3</NodeA>" +
"<NodeB>4</NodeB>" +
"</Node>" +
"</NodePrime>" +
"</elementList>";
StringReader sReader = new StringReader(inputXML);
XmlTextReader reader = new XmlTextReader(sReader);
List<ItemList> itemList = new List<ItemList>();
while (!reader.EOF)
{
if (reader.Name != "Node")
{
reader.ReadToFollowing("Node");
}
if(!reader.EOF)
{
XElement node = (XElement)XElement.ReadFrom(reader);
itemList.Add(new ItemList() {
itemA = (int)node.Element("NodeA"),
itemB = (int)node.Element("NodeB")
});
}
}
}
}
public class ItemList
{
public int itemA { get; set; }
public int itemB { get; set; }
}
}