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

本文关键字:读取 方式 xml 文件 字符串 结构 不知道 情况下 | 更新日期: 2023-09-27 18:12:21

我想将XML层次结构读取到内存对象树中。XML树可以有n个层次的子树。我不知道确切的数字。我的内存对象有一个child和parent属性,它们被绑定到一个树控件。

我怎么能读xml文件/字符串在一个通用的方式进入我的内存对象,当我不知道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");

当然,你可以LinqxElements,并解析层次结构,你可以循环构建你的树控制。

您可以从下面的链接开始使用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
  }
}