在不知道结构的情况下以通用方式读取xml文件/字符串
本文关键字:读取 方式 xml 文件 字符串 结构 不知道 情况下 | 更新日期: 2023-09-27 18:12:21
我想将XML层次结构读取到内存对象树中。XML树可以有n个层次的子树。我不知道确切的数字。我的内存对象有一个child和parent属性,它们被绑定到一个树控件。
我怎么能读xml文件/字符串在一个通用的方式进入我的内存对象,当我不知道xml元素标签是如何调用/写入确切?
例如,有人可以为我提供一个xml结构的单位,其中每个单位有许多单位等…所以我知道xml标签是"单位",但它也可以是"模块"或其他任何东西…它必须工作一般,但我不要求用户输入xml元素标签名称,如"单元"。
我想达到的目标有可能实现吗?
无论哪种方式,您都必须知道解析层次结构的节点名称,至少您必须有一个定义。恕我直言,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
。这是一种简单的方法,您可以允许您的用户指定任何他们希望的节点名称,但有一些约束。
您可以像这样使用XElement
来解析XML
:
XElement xElement = XElement.Load(@"path'to'your'xml'file");
string rootNodeName = xElement.Name.LocalName;
IEnumerable<XElement> xElements = xElement.Descendants(rootNodeName + "s");
当然,你可以Linq
和xElements
,并解析层次结构,你可以循环构建你的树控制。
您可以从下面的链接开始使用xElement:
- http://www.dotnetperls.com/xelement
- java2
- http://www.joe-stevens.com/2010/01/08/linq-to-xml-tutorial/
希望有帮助。
我将把它加载到XmlDocument
然后构建贯穿XmlNodes
的树
我相信你可以实现你想要实现的目标。我会这样做:
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);
看一下XmlTextReader和System.Xml
包。本文也会对您有所帮助:
- http://www.codeproject.com/KB/cpp/XMLReadWrite.aspx
- http://www.noboxsolutions.com/xmltextreader_constructor.aspx
像这样?
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
}
}