【问题标题】:How to parse an arbitrary XML string into a structured object如何将任意 XML 字符串解析为结构化对象
【发布时间】:2016-04-10 20:53:14
【问题描述】:

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

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

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

elem["foo"]["bar"]

并获取baz

编辑:假定的“重复”假设您确实知道 XML 的结构/架构。正如我最初所说,我

【问题讨论】:

标签: c# xml


【解决方案1】:

听起来很像您想要 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 了解更多信息。

【讨论】:

    【解决方案2】:

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

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

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

    编辑:示例更新为可使用 multidimensional indexernote 进行索引。

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

    【讨论】:

    • OP 已澄清他想解析任意 XML 文件。
    • @LeonardoHerrera 这会解析任意 XML 文件吗?
    • 不是真的——我们不知道我们会得到什么样的 XML。例如,您无法获取&lt;root&gt;&lt;foo&gt;&lt;bar&gt;&lt;baz&gt;1&lt;/baz&gt;&lt;baz&gt;2&lt;/baz&gt;&lt;/bar&gt;&lt;/foo&gt;&lt;/root&gt; 中的第二个baz 元素。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2018-10-20
      • 2012-11-15
      • 2012-05-17
      • 2012-07-25
      • 1970-01-01
      相关资源
      最近更新 更多