C# 读取XML文件-读取具有任意数量子节点的子节点
因此,我正在尝试解析一个XML文件,它看起来是这样的:C# 读取XML文件-读取具有任意数量子节点的子节点,c#,xml,C#,Xml,因此,我正在尝试解析一个XML文件,它看起来是这样的: <employees> <employee> <id>1</id> <projects> <projectID>7</projectID> <projectID>3</projectID> </projects>
<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循环:在我看来,我可能会使事情变得过于复杂:通过这样做,我似乎得到了一个对象引用,而不是设置为抛出对象异常的实例。这可能是因为没有设置或实例化员工吗?编辑:没关系,我在项目应该在的地方用错了东西!谢谢:我有一个问题,就是要将每个新的主管实例都添加到列表中。