使用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,只要它能工作。

谢谢你,汤姆。

使用c#: XPath或XDocument解析XML格式的网络数据包

您没有得到正确的结果,因为您的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