无法访问特定的xml节点

时间:2011-05-14 20:09:25

标签: c# xml xpath xml-namespaces

我想要达到x:属性节点及其属性:

XML:

<Activity mc:Ignorable="sap" x:Class="WebApplication3.work" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s1="clr-namespace:System;assembly=System" xmlns:s2="clr-namespace:System;assembly=System.Xml" xmlns:s3="clr-namespace:System;assembly=System.Core" xmlns:s4="clr-namespace:System;assembly=System.ServiceModel" xmlns:sa="clr-namespace:System.Activities;assembly=System.Activities" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System" xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel" xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core" xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:sd="clr-namespace:System.Data;assembly=System.Data" xmlns:sl="clr-namespace:System.Linq;assembly=System.Core" xmlns:st="clr-namespace:System.Text;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <x:Members>
     <x:Property Name="number1" Type="InArgument(x:Int32)" />
     <x:Property Name="number2" Type="InArgument(x:Int32)" />
     <x:Property Name="total" Type="OutArgument(x:Int32)" />
  </x:Members>
.......
</Activity>

C#代码:

        XmlDocument doc = new XmlDocument();
        doc.Load(filePath);

        XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
        manager.AddNamespace("x", "http://schemas.microsoft.com/winfx/2006/xaml");
        XmlNodeList elements = doc.SelectNodes("//Activity/x:Members/x:Property",manager);

不幸的是,元素变量返回0节点。你能救我吗?

3 个答案:

答案 0 :(得分:2)

var xdocument = XDocument.Load(filePath);
var xname = XName.Get("Property", "http://schemas.microsoft.com/winfx/2006/xaml");
var propertyNodes = xdocument.Descendants(xname).ToList();

答案 1 :(得分:0)

试试这个

XmlNodeList elemList = doc.GetElementsByTagName("x:Property");

答案 2 :(得分:0)

问题是该文档位于默认命名空间

在XPath表达式中:

//Activity/x:Members/x:Property

名称Activity没有前缀,XPath将其视为“无命名空间”。

XPath评估程序正在尝试查找文档中“无命名空间”并且失败的所有Activity元素 - 因此结果为0。

解决方案很简单

只需将此行添加到您的代码中:

manager.AddNamespace("def", "http://schemas.microsoft.com/netfx/2009/xaml/activities");

然后评估此XPath表达式

 XmlNodeList elements = doc.SelectNodes("//def:Activity/x:Members/x:Property",manager);