XML问题,请高手们帮忙!SelectSingleNode()查不到值
xml文件:
<?xml version= "1.0 " encoding= "utf-8 "?>
<SequentialWorkflowActivity x:Name= "CustomWorkflow " xmlns:ns0= "clr-namespace:Step.WorkFlowDesigner.WorkFlowActivities;Assembly=Step.WorkFlowDesigner.WorkFlowActivities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null " xmlns:x= "http://schemas.microsoft.com/winfx/2006/xaml " xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/workflow " x:Class= "WorkflowDesignerControl.CustomWorkflow ">
<ns0:ApproveNode ApproverType= "Person " x:Name= "approveNode1 " Approver= "Scaler " />
<ns0:IfElseNode x:Name= "ifElseNode1 ">
<ns0:IfElseBranchNode x:Name= "ifElseBranchNode1 " Condition= "Count<100 ">
<ns0:ApproveNode ApproverType= "Person " x:Name= "approveNode2 " Approver= "Scaler " />
</ns0:IfElseBranchNode>
<ns0:IfElseBranchNode x:Name= "ifElseBranchNode2 ">
<ns0:ApproveNode ApproverType= "Person " x:Name= "approveNode3 " Approver= "Scaler " />
</ns0:IfElseBranchNode>
</ns0:IfElseNode>
<ns0:ApproveNode ApproverType= "Person " x:Name= "approveNode4 " Approver= "Scaler " />
</SequentialWorkflowActivity>
C# Code:XmlNode root= xmlDoc.SelectSingleNode "SequentialWorkflowActivity ");返回null
急切等待中,谢谢!!!
------解决方案--------------------测试代码如下:
private void button1_Click(object sender, EventArgs e)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(@ "d:\\temp\xmlfile1.xml ");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace( "ns ", "http://schemas.microsoft.com/winfx/2006/xaml/workflow ");
XmlNode root = xmlDoc.SelectSingleNode( "ns:SequentialWorkflowActivity ", nsmgr);
}
------解决方案--------------------用xmldoc.DocumentElement
------解决方案--------------------纯属个人经验,当Xml文档中包括名称空间的时候,读取节点要使用带有名称空间的函数的重载,在所有的名称空间中查找没有名称的默认的名称空间,在楼主所给的Xml文档中这个节点是如下的这个属性:
xmlns= "http://schemas.microsoft.com/winfx/2006/xaml/workflow "
在XmlNamespaceManager 中添加这个属性并起一个名称,比如 "ns ",添加之:
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace( "ns ", "http://schemas.microsoft.com/winfx/2006/xaml/workflow ");
这样,在使用SelectSingleNode取节点的时候,把没有指定名称空间的节点,比如楼主要取的第一个节点加上这个命名的名称空间就可以取了:
XmlNode root = xmlDoc.SelectSingleNode( "ns:SequentialWorkflowActivity ", nsmgr);
------解决方案--------------------如果在节点中已给出了节点的名称空间,则SelectSingleNode中的节点路径不变,比如:
ns0:ApproveNode节点,在SelectSingleNode中直接写 "ns0:ApproveNode ".
如果没有名称空间,应是默认的名称空间,就是没有名称而手动加上的那个 "ns "。
不知道.NET本身手问题还是我不全使用,对于没有名称的名称空间在XmlNamespaceManager 添加时有问题,就是取不到默认的节点,而必需要给默认名称空间加上一个指定的名称。就像上面的程序一样才可以。