我是.net和c#的新手,所以我想确保我正在使用合适的工具。
我收到的XML是另一台机器上的目录树的描述,因此深入了解多层次。我现在需要做的是获取XML并创建一个对象结构(自定义类),并使用XML输入中的信息填充它们,如文件,文件夹,标签,属性......
这个XML输入的Tree结构在我看来是使用递归来遍历树的主要候选者。
在.net 3.5中有不同的方法吗?
我看过XmlReaders,但它们似乎是以线性的方式走在树上,而不是我正在寻找的......
我收到的XML是第三方api的一部分,因此不受我的控制,可能会在期货中发生变化。
我已经研究过反序列化,但它有缺点(黑盒实现,需要声明成员是公共的,慢的,只适用于简单的对象......)也将它从列表中删除。
感谢您对此的意见。
答案 0 :(得分:22)
我会在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的东西来遍历所有元素。构建元素的一种方法是这样的:
List<MyFileType> files = new List<MyFileType>();
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#的人。
答案 1 :(得分:2)
XmlReader不是一个特别友好的API。如果您可以使用.NET 3.5,那么加载到LINQ to XML可能是您最好的选择。你可以轻松地使用递归。
否则,XmlDocument仍然可以做到这一点......只是不那么愉快。
答案 2 :(得分:2)
这是一个非常适合递归的问题。
要详细说明另一张海报所说的内容,您首先需要将XML加载到 System.Xml.XmlDocument 中,(使用 LoadXml 或加载)。
您可以使用 XmlDocument.DocumentElement 属性访问树的根,并使用 ChildNodes属性访问每个节点的子节点。子节点返回一个集合,当Collection的大小为0时,您知道您已经达到了基本情况。
使用LINQ也是一个不错的选择,但我无法详细说明这个解决方案,因为我不是真正的LINQ专家。
正如Jon所说,XmlReader不是很友好。如果您最终遇到性能问题,您可能需要查看它,但如果您只想完成工作,请使用递归来使用XmlDocument / ChildNodes。
答案 3 :(得分:1)
将XML加载到XMLDocument中。然后,您可以使用递归来遍历XMLDocuments DOM。
您可能还想查看工厂方法模式来创建类,这里非常有用。