C#中的XML解析。与后代的问题

时间:2016-01-14 23:58:57

标签: c# xml xml-parsing xmlreader

我有一个需要解析的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返回空。

请让我知道我做错了什么,以及最好的方法。

2 个答案:

答案 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; }
    }
}