我是.net和c#的新手,所以我想确保我正在使用正确的工具来完成工作.
我收到的XML是对另一台机器上的目录树的描述,因此深入了解多层次.我现在需要做的是获取XML并创建一个对象结构(自定义类),并使用XML输入中的信息填充它们,如文件,文件夹,标签,属性......
在我看来,这个XML输入的Tree结构使得它成为使用递归来遍历树的主要候选者.
在.net 3.5中有不同的方法吗?
我看过XmlReaders,但它们似乎是以线性方式走在树上,而不是我正在寻找的......
我收到的XML是第三方API的一部分,因此不受我的控制,并且可能会在未来发生变化.
我已经研究了反序列化,但它有缺点(黑盒实现,需要声明成员是公共的,慢的,只适用于简单的对象......)也将它从列表中取出.
感谢您对此的意见.
我会在System.Xml.Linq中使用XLINQ类(这是您需要引用的命名空间和程序集).将XML加载到XDocument中:
XDocument doc = XDocument.Parse(someString);
接下来,您可以使用递归或伪递归循环来迭代子节点.您可以选择以下子节点:
//if Directory is tag name of Directory XML //Note: Root is just the root XElement of the document var directoryElements = doc.Root.Elements("Directory"); //you get the idea var fileElements = doc.Root.Elements("File");
变量directoryElements和fileElements将是IEnumerable类型,这意味着您可以使用类似foreach的东西来遍历所有元素.构建元素的一种方法是这样的:
Listfiles = new List (); foreach(XElelement fileElement in fileElements) { files.Add(new MyFileType() { Prop1 = fileElement.Element("Prop1"), //assumes properties are elements Prop2 = fileElement.Element("Prop2"), }); }
在示例中,MyFileType是您为表示文件而创建的类型.这是一种蛮力攻击,但它将完成工作.
如果要使用XPath,则需要使用 System.Xml.XPath.
关于System.Xml与System.Xml.Linq的注释
自1.0天以来,.Net中有许多XML类.这些(主要)在System.Xml中.在.Net 3.5中,在System.Xml.Linq下发布了一组精彩的新XML类.我不能过分强调它们比System.Xml中的旧类更好.我强烈推荐给任何.Net程序员,特别是刚进入.Net/C#的人.