使用c#: XPath或XDocument解析XML格式的网络数据包
本文关键字:格式 XML 网络 数据包 解析 XDocument XPath 使用 | 更新日期: 2023-09-27 18:18:54
我正在尝试从数据包中提取关键数据。所讨论的数据是IP源、IP目的和端口目的。下面是xml格式的数据包摘录。我正试图取出这个信息,并显示在一个形式。
<pdml>
<packet>
<proto name="ip" showname="Internet Protocol Version 4, Src: 192.168.1.204 (192.168.1.204), Dst: 162.159.242.165 (162.159.242.165)" size="20" pos="14">
<field name="ip.src" showname="Source: 192.168.1.204 (192.168.1.204)" size="4" pos="26" show="192.168.1.204" value="c0a801cc"/>
<field name="ip.dst" showname="Destination: 162.159.242.165 (162.159.242.165)" size="4" pos="30" show="162.159.242.165" value="a29ff2a5"/>
</proto>
<proto name="tcp" showname="Transmission Control Protocol, Src Port: 6287 (6287), Dst Port: 443 (443), Seq: 1, Ack: 1, Len: 0" size="20" pos="34">
<field name="tcp.dstport" showname="Destination Port: 443 (443)" size="2" pos="36" show="443" value="01bb"/>
</proto>
</packet>
</pdml>
我在尝试这样做时遇到了麻烦,并且尝试了XPath和XDocument都无济于事(遵循了不同的示例,但都不起作用)。我的代码现在看起来像这样:
public void LoadPackets()
{
var xmlDoc2 = new XmlDocument();
xmlDoc2.Load("Packets.xml");
var node = xmlDoc2.SelectSingleNode("/pdml/packet/proto/field[text()='ip.src'];
string ipsrc = node.InnerText;
string ipdst = ("Carrot");
string portdst = ("Carrot");
list.Items.Add(new PacketFilter(ipsrc, ipdst, portdst));
}
显然,你可以忽略胡萝卜文本,它只是为了填满它们,同时试图找出ip源地址。
当前我正在获取消息:
附加信息:表达式必须求值为节点集。
但是我怎么也想不出为什么。在这件事上任何帮助都太好了。我不介意使用XPath或XDocument,只要它能工作。
谢谢你,汤姆。
您没有得到正确的结果,因为您的XPath是错误的,'text()'函数找到文本节点,但您想通过属性值进行选择,所以您需要更改它,如:
var node = xmlDoc2.SelectSingleNode("pdml/packet/proto/field[@name='ip.src']/@show");
string ipsrc = node.Value; //ipsrc = 192.168.1.204
或选择所有字段,像这样:
var elements = xmlDoc2.SelectNodes("//field");
foreach (XmlNode element in elements)
{
Debug.WriteLine("Name: {0} Value: {1}", element.Attributes["name"].Value, element.Attributes["show"].Value);
}
//Outputs
Name: ip.src Value: 192.168.1.204
Name: ip.dst Value: 162.159.242.165
Name: tcp.dstport Value: 443
使用XDocument,您可以这样做以获得所有字段的列表:
XDocument doc = //load your data into XDocument
var elements = from e in doc.Descendants("field")
select new {
Name = (string)e.Attribute("name"),
Value = (string)e.Attribute("show")
};
结果将得到相同的输出:
foreach (var element in elements)
{
Debug.WriteLine("Name: {0} Value: {1}", element.Name, element.Value);
}
Name: ip.src Value: 192.168.1.204
Name: ip.dst Value: 162.159.242.165
Name: tcp.dstport Value: 443