【问题标题】:Cannot parse XML using Xpath无法使用 Xpath 解析 XML
【发布时间】:2012-04-07 04:06:11
【问题描述】:

我在解析 XML 文件时遇到问题。我设法使用 xpath 读取了一些示例 xml 文件,但我无法读取我的 XML 文件。无论我作为 xpath 表达式输入什么,它都无法解析文件。

这是我要读取的 xml 文件

<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>dino</name>
<SSIDConfig>
   <SSID>
      <hex>64696E6F</hex>
      <name>dino</name>
   </SSID>
</SSIDConfig>
<connectionType>ESS</connectionType>
<connectionMode>auto</connectionMode>
<MSM>
   <security>
      <authEncryption>
         <authentication>open</authentication>
         <encryption>WEP</encryption>
         <useOneX>false</useOneX>
      </authEncryption>
      <sharedKey>
         <keyType>networkKey</keyType>
         <protected>true</protected>
         <keyMaterial>01000000D08C9DDF0115D1118C7A00C04FC297EB010000000C046798E62AF24993A8197E7DBF7BDC00000000020000000000106600000001000020000000E64B73274BEAB7199AB89DB1CFED12146D88E9B5EF36823E780F33E9B67E2CDC000000000E80000000020000200000002BF0125DD33F628A7D7B1C867298C62DEF53C6712E8ED4051491F317B0A1710A100000003748D54F3C408A3E076006C03174B10440000000BF822418926AF8663A6FE9619C34C765009EB9D8B23104FEBE049EB1E5B96F8BD61D3E8056885958616E5C50CE9FDF6DC4517B4405C0C45EA392327964301508</keyMaterial>
      </sharedKey>
   </security>
</MSM>
</WLANProfile>

例如,我想获取 keyMaterial。这是代码

string fileloc = String.Format("{0}/dino.xml", destination);

        label3.Text = fileloc; // path check

        XPathDocument doc = new XPathDocument(fileloc);
        XPathNavigator nav = doc.CreateNavigator();

        XPathExpression expr;
        expr = nav.Compile("/WLANProfile/MSM/security/sharedKey/keyMaterial");
        XPathNodeIterator iterator = nav.Select(expr);

        listBox1.Items.Clear();
        try
        {
            while (iterator.MoveNext())
            {
                XPathNavigator nav2 = iterator.Current.Clone();
                listBox1.Items.Add("keyMaterial: " + nav2.Value);
            }
        }
        catch (Exception ex)
        {
            label2.Text = ex.Message;

那么,问题出在哪里?无论我作为 nav.Compile 输入什么,listBox 都是空的。

【问题讨论】:

  • 你为什么不改用XDocument
  • 我想使用 xPath。如果我们无法解析它,那么我将使用 XDocument。
  • 尝试将命名空间添加到表达式。看起来缺少命名空间是问题

标签: c# xml xpath


【解决方案1】:

尝试使用您的代码,我已经检查过并且可以正常工作:

XPathDocument doc = new XPathDocument(fileloc);
XPathNavigator nav = doc.CreateNavigator();

XmlNamespaceManager manager = new XmlNamespaceManager(nav.NameTable);
manager.AddNamespace("bk", "http://www.microsoft.com/networking/WLAN/profile/v1");


XPathNodeIterator iterator = nav.Select("/bk:WLANProfile/bk:MSM/bk:security/bk:sharedKey/bk:keyMaterial", manager);

【讨论】:

    【解决方案2】:

    如果你想使用 XDocument

    XDocument xDoc = XDocument.Load(.....);
    XNamespace ns = XNamespace.Get("http://www.microsoft.com/networking/WLAN/profile/v1");
    var key = xDoc.Descendants(ns+"keyMaterial").First();
    

    【讨论】:

    • 后来我遇到了一些错误,所以我添加了 First.Value。现在工作正常,但我将使用 xpath。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2012-01-08
    • 2013-02-20
    相关资源
    最近更新 更多