如何将任意XML字符串解析为结构化对象

本文关键字:结构化 对象 字符串 任意 XML | 更新日期: 2023-09-27 18:29:24

我有一个XML数据字符串,其模式未知。我想把它解析成一个树结构,我的代码可以很容易地阅读。例如,如果字符串为:

<foo><bar>baz</bar></foo>

我想能够访问它的代码像:

elem["foo"]["bar"]

得到CCD_ 1。

编辑:所谓的"重复"假设您知道XML的结构/模式。正如我最初所说,我做而不是

如何将任意XML字符串解析为结构化对象

听起来很像您想要LINQ to XML提供的功能。像这样解析XML:

var doc = XDocument.Parse(@"<foo><bar>baz</bar></foo>");

然后你可以用类似于你建议的语法的方式来查询它:

var barValue = (string)doc.Elements("foo").Elements("bar").Single()

或:

var barValue = (string)doc.Descendants("bar").Single()

有关详细信息,请参阅文档。

就我个人而言,我同意其他答案,即基于LINQ到XML的解决方案是最好的。类似于:

string xml = "<root><foo><bar>baz</bar></foo></root>";
string s = XElement.Parse(xml).Element("foo").Element("bar").Value;

但是,如果真的想要像您的示例那样的行为,您可以编写一个小包装类,例如:

EDIT:使用多维索引器更新为可索引的示例注意

class MyXmlWrapper
{
    XElement _xml;
    public MyXmlWrapper(XElement xml)
    {
        _xml = xml;
    }
    public MyXmlWrapper this[string name, int index = 0]
    {
        get
        {
            return new MyXmlWrapper(_xml.Elements(name).ElementAt(index));
        }
    }
    public static implicit operator string(MyXmlWrapper xml)
    {
        return xml._xml.Value;
    }
}

按照你的意愿使用

string xml = "<root><foo><bar>baz</bar></foo></root>";
MyXmlWrapper wrapper = new MyXmlWrapper(XElement.Parse(xml));
string s = wrapper["foo"]["bar"];

从集合返回元素的编辑示例:

string xml = "<root><foo><bar><baz>1</baz><baz>2</baz></bar></foo></root>";
MyXmlWrapper wrapper = new MyXmlWrapper(XElement.Parse(xml));
string baz1 = wrapper["foo"]["bar"]["baz", 0];
string baz2 = wrapper["foo"]["bar"]["baz", 1];

XDocument.Parse(string)是您的朋友:

https://msdn.microsoft.com/en-us/library/bb345532(v=vs.110).aspx