2011-05-14 113 views
2

我想達到X:房產節點及其屬性:不能達到特定的XML節點

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個節點。你可以幫我嗎?

+0

你不應該選擇' (「/ Activity/x:Members」)'節點,然後查找它的ChildNodes? – Marco 2011-05-14 20:16:33

+0

看起來'Activity'元素是用一個名稱空間定義的,因此您可能需要將該名稱空間添加到管理器並修改您的xpath以匹配它。 – ewh 2011-05-14 20:23:41

+0

有人提供了GetElementsByTagName(「x:Property」);並刪除了他的帖子。它的工作原理是這樣的,但這會導致問題嗎? – ozgkrc 2011-05-14 20:24:06

回答

0

試試這個

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

它這樣工作,謝謝 – ozgkrc 2011-05-14 20:24:47

2
var xdocument = XDocument.Load(filePath); 
var xname = XName.Get("Property", "http://schemas.microsoft.com/winfx/2006/xaml"); 
var propertyNodes = xdocument.Descendants(xname).ToList(); 
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);