Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取XML文件-读取具有任意数量子节点的子节点_C#_Xml - Fatal编程技术网

C# 读取XML文件-读取具有任意数量子节点的子节点

C# 读取XML文件-读取具有任意数量子节点的子节点,c#,xml,C#,Xml,因此,我正在尝试解析一个XML文件,它看起来是这样的: <employees> <employee> <id>1</id> <projects> <projectID>7</projectID> <projectID>3</projectID> </projects>

因此,我正在尝试解析一个XML文件,它看起来是这样的:

<employees>
    <employee>
     <id>1</id>
         <projects>
            <projectID>7</projectID>
            <projectID>3</projectID>
         </projects>
    </employee>
    <employee>
     <id>2</id>
         <projects>
            <projectID>4</projectID>
         </projects>
    </employee>
</employees>
我试着读入每一位员工和出现的任何数量的项目。Employee对象是字符串和listint

目前我有:

        XmlDocument doc = new XmlDocument();
        doc.Load(path);
        XmlNodeList xmlNodes = doc.DocumentElement.SelectNodes("/employees/employee");
        foreach (XmlNode xmlNode in xmlNodes)
        {
            string id;
            List<int> projects = new List<int>();

            id = xmlNode.SelectSingleNode("id").InnerText;

            //this is the bit. What I have works but it feels like it could
            //be majorly refined. Is there a better way to construct the foreach below?

            foreach (XmlNode node in xmlNode.ChildNodes.Item(1)) 
            //index 1 is the projects node
            {
                projects.Add(int.Parse(node.InnerText));
            }

            //

            Employee e = new Employee(id, projects);
            e.Add(e);
        }
如果XML文件本身存在问题,则可以对其进行更改以适应解析


谢谢。

使用LINQ to XML将更容易:

var xDoc = XDocument.Load(path);
var employees = (from e in xDoc.Root.Elements("employee")
                 let projects = e.Element("projects")
                                 .Elements("projectID")
                                 .Select(p => (int)p)
                                 .ToList()
                 let id = (string)e.Element("id")
                 select new Employee(id, projects)).ToList();

您需要使用System.Linq和System.Xml.Linq才能使其正常工作。

您必须使用XmlDocument吗?使用LINQ到XML XDocument等通常会使事情变得更简单。您想改进什么?是否存在任何性能问题,或者您不喜欢现在的代码外观?如果您使用的是XMLDocument,则可以使用枚举器查看每个节点。例如-XmlNodeList xmlNodes=doc.DocumentElement.SelectNodes/employees/employees;IEnumerator enumList=doc.GetEnumerator,然后循环遍历-1删除上一个并再次询问相同的问题有什么意义?至少,你可以评论一些东西。@L.B想编辑一些东西,但没有意识到有一个编辑按钮:在我创建新帖子后实现/删除旧帖子。为了回答其他评论,我不熟悉Linq库,我想改进代码中的第二个foreach循环:在我看来,我可能会使事情变得过于复杂:通过这样做,我似乎得到了一个对象引用,而不是设置为抛出对象异常的实例。这可能是因为没有设置或实例化员工吗?编辑:没关系,我在项目应该在的地方用错了东西!谢谢:我有一个问题,就是要将每个新的主管实例都添加到列表中。