我努力在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” 我做错了什么?
以下是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”只返回当前一个匹配的节点?当我有更多时间时,我会回到这里。
答案 0 :(得分:1)
这是xpath标记的最常见问题。搜索“xpath默认命名空间”,你会找到许多好的答案,包括SO的答案。
在VB.NET中,应该使用XmlNamespaceManager类来注册名称并将前缀(例如“x”)与之关联。
然后代替
TableRow
使用:
x:TableRow
等等,用于默认命名空间中的所有元素名称。