我想将XML层次结构读入内存中对象的树中。 XML树可以有n级子级。我不知道确切的数字。我的内存中对象有一个子属性和父属性绑定到树控件。
当我不知道如何正确调用/写入xml元素标记时,如何以通用方式将xml文件/字符串读入我的内存中对象?
例如有人可以为我提供单位的xml结构,其中每个单位都有许多单位等...所以我知道xml标签是“单位”但它也可能是“模块”或其他任何东西......它必须工作通用,但我不知道要求用户输入xml元素标签名称,如“unit”。
这有可能实现我想要实现的目标吗?
答案 0 :(得分:1)
我只需将其加载到XmlDocument
中,然后构建通过XmlNodes
的树。
答案 1 :(得分:1)
我相信有可能实现你想要达到的目标。我会做这样的事情:
class GenericNode
{
private List<GenericNode> _Nodes = new List<GenericNode>();
private List<GenericKeyValue> _Attributes = new List<GenericKeyValue>();
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<GenericNode> Nodes
{
get
{
return this._Nodes;
}
}
public IEnumerable<GenericKeyValue> 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);
答案 2 :(得分:1)
无论哪种方式,您必须知道要解析层次结构的节点名称,至少您必须有一个定义。恕我直言,XElement
是唯一一种通用XML
解析器。例如,你有一个像这样的XML:
<module name="core">
<modules>
<module name="xml">
<modules>
<module name="reader" />
<module name="writer" />
</modules>
</module>
<module name="json">
<modules>
<module name="serializer" />
<module name="deserializer" />
</modules>
</module>
</modules>
</module>
正如我之前所说,你应该有一些像root node
这样的定义必须是层次元素名称和子容器必须是root node name + s
。这是一种简单的方法,您可以允许用户指定他们希望但具有一些约束的任何节点名称。
您可以使用XML
解析XElement
,如下所示:
XElement xElement = XElement.Load(@"path\to\your\xml\file");
string rootNodeName = xElement.Name.LocalName;
IEnumerable<XElement> xElements = xElement.Descendants(rootNodeName + "s");
当然,您可以Linq
xElements
并解析您可以重复构建树控件的层次结构。
您可以使用以下链接在xElement上启动:
希望这会有所帮助。
答案 3 :(得分:0)
查看XmlTextReader和System.Xml
个包裹。本文也将对您有所帮助:
答案 4 :(得分:0)
喜欢这个吗?
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
}
}