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

时间:2016-01-06 17:05:52

标签: c# xml

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

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

我希望能够使用以下代码访问它:

elem["foo"]["bar"]

并获取baz

编辑:假设的&#34;重复&#34;假设您执行了解XML的结构/架构。正如我最初所说,我做

3 个答案:

答案 0 :(得分:3)

听起来很像你想要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()

有关详细信息,请参阅the docs

答案 1 :(得分:2)

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

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

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

编辑:使用multidimensional indexer note 将示例更新为可转位。

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];

答案 2 :(得分:1)

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

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