解析XML并使用C#从中获取元素

时间:2014-04-23 19:26:08

标签: c# xml

我有一个XML文件,如下所示:

<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解析的新手)。 / p>

以下是我一直在尝试的代码(不完整,因为我不知道接下来要去哪里):

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地址和供应商。

据我所知,这与阅读&lt;&gt;之间的文字略有不同标签,所以我必须使用像Attributes["name"].Value这样的东西。

我不确定在foreach循环中使用XmlNodeList是否可以这样做,但由于每个元素都有2个元素,我需要一种方法来单独选择它们。这样做应该允许我选择正确的索引吗?

有人可以帮我指出正确的方向吗?

非常感谢,如果您需要其他信息,请与我们联系。

2 个答案:

答案 0 :(得分: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查询。

答案 1 :(得分: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");
}