2012-07-02 128 views
2

我有SharePoint web服务返回的这样的XML结构。SharePoint XML解析c#

<rs:data ItemCount="4" xmlns:rs="urn:company:rowset"> 
    <z:row ows_AssetId="HP010336520" /> 
    <z:row ows_AssetId="HP010336519" /> 
    <z:row ows_AssetId="HP010354403" /> 
    <z:row ows_AssetId="HP010357062" /> 
</rs:data> 

    private static void Parser(List<XmlNode> data) 
    { 

     List<XmlNodeList> rows = (from row in data.AsEnumerable() 
          select row.SelectNodes("data/row")).ToList(); 
    }        

我试图查询一行,但没有运气。你们能帮我吗?

回答

4

查询节点列表时,需要使用XmlNamespaceManager。在您的代码中未看到的是文档根目录中'z'命名空间的声明:xmlns:z =“#RowsetSchema”。

尝试在你的解析器方法如下:

NameTable nameTable = new NameTable(); 
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(nameTable); 
    nsmgr.AddNamespace("z", "#RowsetSchema"); 

    List<XmlNodeList> rows = (from row in data.AsEnumerable() 
           select row.SelectNodes("//z:row", nsmgr)).ToList(); 
+0

谢谢!看起来像是发生了什么,但是所有的XmlNodes都是空的...: - ( –

+0

正确,这与你的片段一致 你的**属性** node,ows_AssetId,但节点中没有** text **内容。如果有文本内容,您的片段可能如下所示: Hello World。 您可以查询通过使用'@'符号: 'List rows =(from row in data.AsEnumerable() select row.SelectNodes(“// z:row [@ ows_AssetId ='HP010357062']”,nsmgr)) .ToList();' 你可以得到值以类似的方式。 –

1

我现在不在我可以测试的地方,但我相信至少有一部分问题是您在查询中省略了命名空间 - 而不是“数据/行”,请尝试“rs:data/Z:排”。

+0

谢谢!你能解释我什么是rs和z是什么? –

+0

命名空间是一种解决标识符中潜在的命名冲突的方法。他们还表示,某个元素存在于某个上下文中。 命名空间由元素名称前面的文本指示,因此片段中的命名空间为'rs'和'z'。有关更详细的信息,请查看http://en.wikipedia.org/wiki/XML_namespace或http://msdn.microsoft.com/en-us/magazine/cc302166.aspx。 –