首页 新闻 会员 周边

xml命名空间和前缀相同如何解析?

0
悬赏园豆:20 [待解决问题]

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
 xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
        xmlns:rs='urn:schemas-microsoft-com:rowset'
 xmlns:z="#RowsetSchema">
<s:Schema id='RowsetSchema'>
 <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
  <s:AttributeType name='c0' rs:name='门店号' rs:number='1'>
   <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='3' rs:maybenull='false'/>
  </s:AttributeType>
  <s:AttributeType name='c1' rs:name='开始日期' rs:number='2'>
   <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='19' rs:maybenull='false'/>
  </s:AttributeType>
  <s:AttributeType name='c2' rs:name='结束日期' rs:number='3'>
   <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='19' rs:maybenull='false'/>
  </s:AttributeType>
  <s:extends type='rs:rowbase'/>
 </s:ElementType>
</s:Schema>
<rs:data>
 <z:row c0='001' c1='2011-02-16 16:23:40' c2='2011-02-16 16:24:27'/>
</rs:data>
</xml>

这是XML文档,我想取最后<rs:data>中的数据,但获取不到该节点,大侠们帮我看看怎么回事

 doc = null; //xml文档
 root = null; // xml文档的根元素(节点)
 XmlNamespaceManager nsmgr = null; //xml文档的名空间管理器

 XmlDocument doc = new XmlDocument();
doc.Load(xmlFile.FullName);  //载入文件

 XmlElement   root = doc.DocumentElement;
string nameSpace = root.NamespaceURI;
nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("rs", nameSpace);

XmlNode node = root.SelectSingleNode("rs:data", nsmgr);     //该处node一直为null不知怎么回事?

 

会跳舞的鱼的主页 会跳舞的鱼 | 初学一级 | 园豆:92
提问于:2011-02-22 17:17
< >
分享
所有回答(3)
0

这xml文档的名称空间显的过于复杂了点,没具体操作过多名称空间,不太好说。

路过秋天 | 园豆:4787 (老鸟四级) | 2011-02-23 10:08
0

感觉像是selectsinglenode的xpath参数错误。。。

"rs:data" 前面加个‘/’看看,应该就解决问题了

还有,第二个参数命名空间好像不是这么用的,建议MSDN查查看看

其实,如果rs:data如果总是最后一个node的话,直接childnode[childnode.length - 1]算了,呵呵,不过这不是什么好的办法

xiao_p | 园豆:608 (小虾三级) | 2011-02-28 23:34
0

首先,你的根元素的名称是 xml ,这是一个保留字,不应该起这个元素名称。比如可以修改为 root 等等。

第二,你使用命名空间的方式有问题。

下面的程序可以正确取得这个元素。

修改之后的 xml 文档。

<?xml version="1.0" encoding="utf-8" ?>
<root xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
 xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
        xmlns:rs='urn:schemas-microsoft-com:rowset'
 xmlns:z="#RowsetSchema">
    <s:Schema id='RowsetSchema'>
        <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
            <s:AttributeType name='c0' rs:name='门店号' rs:number='1'>
                <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='3' rs:maybenull='false'/>
            </s:AttributeType>
            <s:AttributeType name='c1' rs:name='开始日期' rs:number='2'>
                <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='19' rs:maybenull='false'/>
            </s:AttributeType>
            <s:AttributeType name='c2' rs:name='结束日期' rs:number='3'>
                <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='19' rs:maybenull='false'/>
            </s:AttributeType>
            <s:extends type='rs:rowbase'/>
        </s:ElementType>
    </s:Schema>
    <rs:data>
        <z:row c0='001' c1='2011-02-16 16:23:40' c2='2011-02-16 16:24:27'/>
    </rs:data>
</root>

读取的程序

class Program
{
    static void Main(string[] args)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load("XMLFile1.xml");

        XmlNamespaceManager nm = new XmlNamespaceManager(doc.NameTable);
        nm.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
        nm.AddNamespace("s", "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882");
        nm.AddNamespace("dt", "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882");
        nm.AddNamespace("z", "#RowsetSchema");

        string xpath = "/root/rs:data";

        XmlNode node = doc.SelectSingleNode(xpath, nm );
        Console.WriteLine(node.Name);
    }
}

希望能解决你的问题。

冠军 | 园豆:886 (小虾三级) | 2011-03-06 21:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册