在C#中读取复杂的XML文件(Unity3d)

时间:2017-06-12 15:07:59

标签: c# .net xml linq unity3d

我在使用Unity中的c#读取XML文档时遇到了大麻烦。 我试图阅读的XML有这样的结构:

<Classes A>
 <Class A></Class A>
 <Class A></Class A>
  <Class A></Class A>
   <Class A>
    <Detail X>
    <Detail Y>
   </Class A>
   <Class A>
   (...)

有时候,A班有孩子;有时,A级是另一个A级等的孩子。

我一直在尝试和研究2天,但是我无法理解如何使用System.XML或System.XML.Linq来阅读它

我能够使用XDocument.Read()读取所有元素及其属性,但是我无法获得有关它们是由其他类继承还是自己生成孩子的任何信息。 如何阅读元素,然后检查是否有孩子,如果

a)有孩子,继续读孩子们

b)没有孩子,继续阅读下一个元素。

据我所知,XNodes可能包含我想要的信息。我也能读取所有的XNode。但是我无法将任何XNode转换为XElement,反之亦然。这些功能都不像我期望的那样。

1 个答案:

答案 0 :(得分:1)

示例XML

<?xml version="1.0" encoding="utf-8" ?>
<Classes A="1">
  <Class A="1.1"/>
  <Class A="1.2">
    <Detail X="1.2.1"/>
  </Class>
  <Class A="1.3">
    <Detail X="1.3.1"/>
    <Detail Y="1.3.2"/>
  </Class>
  <Class A="1.4"/>
</Classes>

C#代码

        public void XMLToTreeView()
        {
            var reader = XmlReader.Create(@"Path\Sample.xml");
            var xElement = XElement.Load(reader);
            reader.Close();
            findAllNodes(xElement, treeView1);
        }

        private void findAllNodes(XElement xElement, TreeView treeView)
        {
            TreeNode ParentNode = treeView.Nodes.Add(xElement.Attributes().FirstOrDefault().Value);
            foreach (XElement childElement in xElement.Elements())
            {
                TreeNode node = new TreeNode();
                node.Text = childElement.Attributes().FirstOrDefault().Value;
                ParentNode.Nodes.Add(node);
                findAllNodes(childElement, node);
            }
        }

        private void findAllNodes(XElement xElement, TreeNode node)
        {
            foreach (XElement childElement in xElement.Elements())
            {
                TreeNode childNode = new TreeNode();
                childNode.Text = childElement.Attributes().FirstOrDefault().Value;
                node.Nodes.Add(childNode);
                findAllNodes(childElement, childNode);
            }
        }

enter image description here