我有一个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--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个元素,我需要一种方法来单独选择它们。这样做应该允许我选择正确的索引吗?
有人可以帮我指出正确的方向吗?
非常感谢,如果您需要其他信息,请与我们联系。
答案 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");
}