日期:2014-05-19  浏览次数:21036 次

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&lt;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 添加时有问题,就是取不到默认的节点,而必需要给默认名称空间加上一个指定的名称。就像上面的程序一样才可以。