在不知道结构的情况下以通用方式读取xml文件/字符串

我想将XML层次结构读入内存中对象的树中。 XML树可以有n级子级。 我不知道确切的数字。 我的内存中对象具有绑定到树控件的children和parent属性。

当我不知道如何完全调用/写入xml元素标记时,如何以通用方式将xml文件/字符串读入我的内存中对象?

例如,某人可以为我提供单位的xml结构,其中每个单位都有许多单位等…所以我知道xml标签是“单位”但它也可能是“模块”或其他任何东西……它必须工作通用但是我不是要求用户输入像“unit”这样的xml元素标记名称。

这有可能实现我想要实现的目标吗?

无论哪种方式,您必须知道要解析层次结构的节点名称,至少您必须有一个定义。 恕我直言, XElement是唯一一种通用XML解析器。 例如,你有一个像这样的XML:

                 

正如我之前所说,你应该有一些定义,比如root node必须是层次结构元素名称,子容器必须是root node name + s 。 这是一种简单的方法,您可以允许用户指定他们希望但具有一些约束的任何节点名称。

您可以使用XElement解析XML如下所示:

 XElement xElement = XElement.Load(@"path\to\your\xml\file"); string rootNodeName = xElement.Name.LocalName; IEnumerable xElements = xElement.Descendants(rootNodeName + "s"); 

当然,您可以Linq xElements并解析您可以重复构建树控件的层次结构。

您可以使用以下链接在xElement上开始:

希望这有帮助。

我只是将它加载到XmlDocument ,然后通过XmlNodes构建树。

我相信有可能实现你想要达到的目标。 我会做这样的事情:

 class GenericNode { private List _Nodes = new List(); private List _Attributes = new List(); public GenericNode(XElement Element) { this.Name = Element.Name; this._Nodes.AddRange(Element.Elements() .Select(e => New GenericNode(e)); this._Attributes.AddRange( Element.Attributes() .Select(a => New GenericKeyValue(a.Key, a.Value)) } public string Name { get; private set; } public IEnumerable Nodes { get { return this._Nodes; } } public IEnumerable Attributes { get { return this._Attributes; } } } class GenericKeyValue { public GenericKeyValue(string Key, string Value) { this.Key = Key; this.Value = Value; } public string Key { get; set; } public string Value { get; set; } } 

然后你简单地说:

 XElement rootElement = XElement.Parse(StringOfXml); // or XElement rootElement = XElement.Load(FileOfXml); GenericNode rootNode = new GenericRode(rootElement); 

看一下XmlTextReader和System.Xml包。 这篇文章也会对你有所帮助:

像这样?

 using System.Xml ; using System.IO; class Program { static void Main( string[] args ) { using ( Stream inputStream = OpenXmlStream() ) { XmlDocument document = new XmlDocument() ; document.Load( inputStream ) ; Process( document ) ; } } static Stream OpenXmlStream() { // provide an input stream for the program } static void Process( XmlDocument document ) { // do something useful here } }