在不知道结构的情况下以通用方式读取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上开始:
- http://www.dotnetperls.com/xelement
- Java2s
- http://www.joe-stevens.com/2010/01/08/linq-to-xml-tutorial/
希望这有帮助。
我只是将它加载到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 } }