簡體   English   中英

如何將任意XML字符串解析為結構化對象

[英]How to parse an arbitrary XML string into a structured object

我有一串XML數據,其模式是未知的。 我想將其解析為樹結構,我的代碼可以輕松閱讀。 例如,如果字符串是:

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

我希望能夠使用以下代碼訪問它:

elem["foo"]["bar"]

並得到baz

編輯:假定的“重復項”假設您確實知道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 to XML的解決方案是最好的。 就像是:

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

但是,如果您確實想要像示例一樣的行為,則可以編寫一個小的包裝器類,例如:

編輯:示例已更新為使用多維索引器 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];

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM