TableRows元素上的RDLC SelectNodes

时间:2011-02-01 14:47:16

标签: xpath rdlc

我努力在RDLC文件的TableRows元素下返回行元素的XMLNodeList。有许多名称空间的例子是原因,但是我已经尝试了所有这些并且无法从我的XPath查询中获取任何节点,尽管公平地说我真的不了解默认/名称空间等。我已经在quickwatch中检查了Default Namespace属性并且它说它的 ”” ??虽然我不知道为什么或如何将其设置为只读。

我用:

定义了我的命名空间
        Dim doc As XmlDocument = New XmlDocument()
        doc.Load(fname)
        Dim root As XmlNode = doc.DocumentElement
        Dim nsmgr As New XmlNamespaceManager(doc.NameTable)
        nsmgr.AddNamespace("rd", "http://schemas.microsoft.com/SQLServer/reporting/reportdesigner")
        nsmgr.AddNamespace("pf", "http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition")

然后在代码中,我希望对行执行某些操作,我将其传递给lst作为XmlNode并执行:

    ' FIRST FIND THE <TableRows> NODE, UNDER MY CURRENT <Header> ELEMENT
    Dim TableRowsNode As XmlNode = lst.Item("TableRows") ' where lst is the <Header> element of the table in the rdlc i want to process

    ' GET ALL THE ROWS WITHIN THE <TABLEROWS> NODE
    Dim Rows As XmlNodeList = TableRowsNode.SelectNodes("//rd:TableRow", ns) ' where ns is the above nsmgr


    ' FOR EACH ROW
    For Each TableRow As XmlNode In Rows

        ' GET ALL THE CELLS
        Dim TableCells As XmlNode = TableRow.Item("TableCells")

        ' FOR EACH CELL
        For Each TableCell As XmlNode In TableCells

            Dim ReportItems As XmlNode = TableCell.Item("ReportItems")
            For Each ReportItem As XmlNode In ReportItems

                Select Case ReportItem.Name
                    Case "Textbox"
                        txt_lst.Add(ReportItem)
                    Case "Image"
                        img_lst.Add(ReportItem)
                End Select

            Next ' each report item

        Next ' each cell

    Next ' each row
我试过了 “./TableRow”
“//的TableRow”
“.//TableRows”
“// RD:的TableRow”
“// PF:的TableRow”
和其他一些变体,但TableRowsNode.SelectNodes(..)行永远不会返回任何结果(count = 0)

我做错了什么?

以下是rdlc im loading的相关部分的几个片段:

<?xml version="1.0" encoding="utf-8"?>
    <Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">

和我感兴趣的部分......

 <Table Name="table2">
  .....
    <Header>
      <TableRows>
        <TableRow>
        ....
        </TableRow>
        <TableRow>
        .....
        </TableRow>
      </TableRows>  

我想要一个“TableRow”元素的NodeList,这样我就可以生成一个图像,文本框等列表,我将处理它们并且通常做些事情(对于那些感兴趣的人,生成数学符号图像,为他们交换资源字符串相关文本等)...

我已经使用了太长时间了,并且必须有一些愚蠢的简单,因为所有搜索都会导致相同的解决方案名称空间和xpath查询字符串......

请帮忙。

修改 得到xpath查询与“// pf:TableRow”的工作,但它返回整个文档中的所有节点,所以我放弃了,只是使用

Dim Rows As XmlNodeList = TableRowsNode.ChildNodes  

修改 显然“//”使它从文档的顶层搜索,但我不能得到“.//pf:TableRow”只返回当前一个匹配的节点?当我有更多时间时,我会回到这里。

1 个答案:

答案 0 :(得分:1)

这是xpath标记的最常见问题。搜索“xpath默认命名空间”,你会找到许多好的答案,包括SO的答案。

在VB.NET中,应该使用XmlNamespaceManager来注册名称并将前缀(例如“x”)与之关联。

然后代替

TableRow

使用

x:TableRow

等等,用于默认命名空间中的所有元素名称。