簡體   English   中英

如何從xml文件中讀取變量子節點?

[英]How to read variable child nodes from an xml file?

我需要解析一個xml配置文件,其中包含可變數量的節點,這些節點又包含可變數量的子節點。 無論我有多少個VM節點或vmClient節點,我如何讀入所有值? 我在這個項目中使用C#和VS2012。 順便說一句,如果有更好的方法來構建xml文件中的數據,請告訴我! 這是xml文件:

<!--VM settings on ESX Server-->
<VM name="DE2008">
    <vmLanguage value = "de"/>
    <vmSnapshot value = "test"/>
    <vmPowerOn value = "true"/>
    <vmClients>
        <vmClient name="ITXPPRO">
            <vmClientSnapshot value="test2"/>
            <vmClientLanguage value="it"/>
        </vmClient>
        <vmClient name="JPXPPRO">
            <vmClientSnapshot value="test3"/>
            <vmClientLanguage value="jp"/>
        </vmClient>
    </vmClients>
</VM>

<VM name="FR2003">
    <vmLanguage value = "fr"/>
    <vmSnapshot value = "test"/>
    <vmPowerOn value = "true"/>
    <vmClients>
        <vmClient name="DAWIN7">
            <vmClientSnapshot value="autotc"/>
            <vmClientLanguage value="da"/>
        </vmClient>
    </vmClients>
</VM>

<!--SQL Servers used as database servers for ePO-->
<sqlServers>
    <sqlName value = "DE2008SQL"/>
    <sqlLanguage value = "de"/>
    <sqlSnapshot value = "sql"/>
</sqlServers>

我建議你使用LINQ to XML

var xdoc = XDocument.Load(path_to_xml);
var query = from vm in xdoc.Descendants("VM")
            select new {
               Name = (string)vm.Attribute("name"),
               Language = (string)vm.Element("vmLanguage").Attribute("value"),
               Snapshot = (string)vm.Element("vmSnapshot").Attribute("value"),
               PowerOn = (bool)vm.Element("vmPowerOn").Attribute("value"),
               Clients = from c in vm.Element("vmClients").Elements()
                         select new {
                            Name = (string)c.Attribute("name"),
                            // etc
                         }
            };

另外,我建議您將值直接存儲為元素值,或者存儲在屬性中,而不是

Language = (string)vm.Element("vmLanguage").Attribute("value")

你將能夠使用(如果缺少一些元素你也不會得到異常)

Language = (string)vm.Element("vmLanguage") // if value stored in element
// or
Language = (string)vm.Attribute("vmLanguage") // if value stored in attribute

前綴vm對我來說有點奇怪。 如果它是vm數據的一部分,為什么不簡單地使用language 所以,我會采用以下配置:

<vm name="DE2008" language="de" shapshot="test" powerOn="true">
    <clients>
        <client name="ITXPPRO" snapshot="test2" language="it"/>
        <client name="ITXPPRO" snapshot="test3" language="jp"/>
    </clients>
</vm>

你只是使用這樣的東西

    XDocument xDocument = XDocument.Load(yourconfigfilepath);


            var firstresult = xDocument.Descendants("VM");
foreach (var elt in result)
            {
                var childforeachNode = xDocument.Descendants("vmClient");

            }

暫無
暫無

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

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