2014-04-23 120 views
1

從它那裏得到元素我有一個XML文件,如以下:解析XML和使用C#

<host> 
    <status state="up" reason="arp-response" reason_ttl="0"/> 
    <address addr="128.208.188.2" addrtype="ipv4"/> 
    <address addr="00:19:D1:3D:65:85" addrtype="mac" vendor="Intel Corporate"/> 
    <hostnames> 
     <hostname name="d0slf4.phys.washington.edu" type="PTR"/> 
    </hostnames> 
    <times srtt="1000" rttvar="5000" to="100000"/> 
</host> 

<host> 
    <status state="up" reason="arp-response" reason_ttl="0"/> 
    <address addr="128.208.188.3" addrtype="ipv4"/> 
    <address addr="3C:94:D5:AC:18:7D" addrtype="mac" vendor="Juniper Networks"/> 
    <hostnames> 
     <hostname name="xe-0-3-2-&#45;1378.uwar-atg-1.infra.washington.edu" type="PTR"/> 
    </hostnames> 
    <times srtt="92000" rttvar="92000" to="460000"/> 
</host> 

上面的代碼是兩個對象中的一個大文件的樣品。我想要獲取文件中的所有主機,併爲每個主機顯示名稱,ipv4地址和供應商。

我一直在做搜索的最後一個小時,而我已經找到了一些很好的例子,他們都不符合我需要的東西。(對不起,我是新來的XML解析)。

這是我一直在努力的代碼(不完整的,因爲我不知道下一步去哪裏):

string path = ""\\thor\test$\DataSubnetScans\" + _readableSubnet + ".xml"; 

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(path); 

XmlNodeList hosts = xmlDoc.GetElementsByTagName("host"); 
foreach (XmlNode host in hosts) 
{ 
    // get elements (FQDN, IPv4, Vendor) 
    XmlNodeList FQDN = this.GetElementsByTagName("hostname"); 
} 

的代碼foreach循環內的線是錯誤的,這只是一個猜測。正如你在上面看到的,我試圖創建所有元素的列表,然後爲每個元素獲取主機名稱,ipv4地址和供應商。

據我所知,這與閱讀<>標籤之間的文本有點不同,所以我不得不使用類似Attributes["name"].Value之類的東西。

我不確定在foreach循環中使用XmlNodeList是否是這樣做的方式,但是因爲每個元素都有2個元素,所以我需要一種方法來單獨選擇它們。這樣做應該讓我選擇索引權?

有人能幫助我指出了正確的方向?

多謝了,請讓我知道如果你需要更多的信息。

+0

對於您在上面給出的XML,什麼是確切的結果應該是什麼樣子的? –

+1

查覈[LINQ到XML](http://msdn.microsoft.com/en-us/library/bb387098.aspx)。 [This bit](http://msdn.microsoft.com/en-us/library/bb387067.aspx)可能特別有用。 – tnw

+0

@MarkCidade 因爲我已經給了XML,我想拉的主機名,IPv4地址,和供應商,並創建列出他們每個主機上 –

回答

2

下面的方法將是有用的:

可以按如下方式獲取信息:

foreach (XmlNode host in hosts) 
{ 
    var hostname = ((XmlElement) host.SelectSingleNode("hostnames/hostname")).GetAttribute("name"); 
    var ipv4Address = ((XmlElement) host.SelectSingleNode("address[@addrtype='ipv4']")).GetAttribute("addr"); 
    var vendor = ((XmlElement) host.SelectSingleNode("address[@addrtype='ipv6']")).GetAttribute("vendor"); 
    // Add to list 
} 

的示例假設你的XML文檔的結構始終是相同的,所有的元素都包含一個節點。如果結構不同,您可能需要添加一些檢查或優化XPath查詢。

2

你可以做到這一點使用LINQ to XML:

var xmlDocument = XDocument.Load("path"); 

var hosts = xmlDocument.Root.Elements("host"); 

foreach (XElement host in hosts) 
{ 
    var hostName = (string) host.Descendants("hostname") 
        .First().Attribute("name"); 

    var ipv4 = (string) host.Elements("address") 
       .First(x => (string) x.Attribute("addrtype") == "ipv4") 
       .Attribute("addr"); 

    var vendor = (string) host.Elements("address") 
       .First(x => x.Attribute("vendor") != null) 
       .Attribute("vendor"); 
}