Узлы выбора RDLC для элемента TableRows - PullRequest
1 голос
/ 01 февраля 2011

Я изо всех сил пытаюсь вернуть XMLNodeList элементов строки в элементе TableRows файла RDLC.Есть много примеров использования пространств имен, но я попробовал их все и не могу получить какие-либо узлы из моего запроса XPath, хотя, честно говоря, я не очень понимаю пространства имен по умолчанию / пространства имен и т. Д. Я проверил свойство Пространства имен по умолчанию в quickwatch, и он говоритего "" ??хотя я не знаю, почему или как установить его как доступное только для чтения.

я определил мои пространства имен с помощью:

        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

ive попробовал "./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>  

iхочу NodeList элементов «TableRow», чтобы я мог генерировать список изображений, текстовых полей и т. д., с которыми я буду обрабатывать и вообще что-то делать (для тех, кто интересуется, генерированием изображений математических символов, заменой строк ресурсов на связанный с ними текст и т. д.)...

Я занимался этим слишком долго, и должно быть что-тоng глупо просто im отсутствует, так как все поиски приводят к одному и тому же пространству имен решения, а строка запроса xpath ...

, пожалуйста, помогите.

Edit: получил запрос xpathвроде как работать с "// pf: TableRow", но он возвращал все узлы из всего документа, поэтому я сдался и просто использовал

Dim Rows As XmlNodeList = TableRowsNode.ChildNodes  

Edit: , видимо, "// "делает поиск с верхнего уровня документа, но я не могу получить" .//pf:TableRow ", чтобы вернуть только те совпадающие узлы под текущим?Я вернусь к этому позже, когда у меня будет больше времени.

1 Ответ

1 голос
/ 01 февраля 2011

Это наиболее часто задаваемые вопросы по тегу xpath . Ищите «пространство имен xpath по умолчанию», и вы найдете много хороших ответов, в том числе от SO.

В VB.NET следует использовать XmlNamespaceManager class , чтобы зарегистрировать имя и связать с ним префикс (скажем, "x").

Тогда вместо

TableRow

использование :

x:TableRow

и т. Д. Для всех имен элементов, находящихся в пространстве имен по умолчанию.

...