Почему getElementsByTagName не находит элементы? - PullRequest
1 голос
/ 07 мая 2019

Я новичок в обработке документов XML и DOM Microsoft, поэтому извиняюсь, если упускаю что-то очевидное.

У меня есть набор документов в формате XML, который в конечном итоге я хочу редактировать программно.В качестве шага открытия я пытаюсь открыть один и посмотреть, как читать его содержимое.

Следуя примерам, которые я нашел в Интернете, я создал консольный проект в Visual Studio 2019 и написал несколько строк.кода.

Документ содержит 2 экземпляра элемента «DataSource», но метод getElementsByTagName («DataSource»), похоже, не находит их.Действительно, какой бы тег я ни дал команде, длина массива элементов всегда возвращается как 0.

Что я делаю не так?

МОЙ XML выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Report MustUnderstand="df" xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner" xmlns:df="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition/defaultfontfamily">
  <df:DefaultFontFamily>Segoe UI</df:DefaultFontFamily>
  <AutoRefresh>0</AutoRefresh>
  <DataSources>
    <DataSource Name="SharedDataSource">
      <DataSourceReference>QL_Copy</DataSourceReference>
      <rd:SecurityType>None</rd:SecurityType>
      <rd:DataSourceID>801777da-c111-4aa2-b8e9-49ba90f19774</rd:DataSourceID>
    </DataSource>
    <DataSource Name="CustomDataSource">
      <ConnectionProperties>
        <DataProvider>SQL</DataProvider>
        <ConnectString>Data Source=v-citywsql03;Initial Catalog=BE</ConnectString>
        <IntegratedSecurity>true</IntegratedSecurity>
      </ConnectionProperties>
      <rd:SecurityType>Integrated</rd:SecurityType>
      <rd:DataSourceID>dcfb0e9c-06d9-4538-9ec6-1568b32daf3b</rd:DataSourceID>
    </DataSource>
  </DataSources>
  <ReportSections>
    <ReportSection>
      <Body>
        <Height>2in</Height>
        <Style />
      </Body>
      <Width>6.5in</Width>
      <Page>
        <PageHeight>29.7cm</PageHeight>
        <PageWidth>21cm</PageWidth>
        <LeftMargin>2cm</LeftMargin>
        <RightMargin>2cm</RightMargin>
        <TopMargin>2cm</TopMargin>
        <BottomMargin>2cm</BottomMargin>
        <ColumnSpacing>0.13cm</ColumnSpacing>
        <Style />
      </Page>
    </ReportSection>
  </ReportSections>
  <ReportParametersLayout>
    <GridLayoutDefinition>
      <NumberOfColumns>4</NumberOfColumns>
      <NumberOfRows>2</NumberOfRows>
    </GridLayoutDefinition>
  </ReportParametersLayout>
  <rd:ReportUnitType>Cm</rd:ReportUnitType>
  <rd:ReportID>f3bca84a-9587-4ba2-b1ed-57e31a33eb3b</rd:ReportID>
</Report>

Модуль Module1

Sub Main()
    Dim ReportFilename As String
    Dim xmlDoc As Object
    Dim xmlSourceList As Object

    ReportFilename = "C:Temp\Report1.xml"

    xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
    xmlDoc.async = False
    xmlDoc.Load(ReportFilename)

    xmlSourceList = xmlDoc.getElementsByTagName("DataSource")
    MsgBox(xmlSourceList.length)

End Sub

Конечный модуль

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Элементы находятся в пространстве имен (http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition), поэтому вы должны использовать форму с двумя аргументами getElementsByTagName(uri, localname), предоставляющую пространство имен.

0 голосов
/ 07 мая 2019

Я могу заметить одну ошибку: в вашем Пути есть опечатка "C:Temp\Report1.xml".

Если это не устраняет ошибку, попробуйте изменить тип из Object, который вы создаете, и вместо него используйте "microsoft.XMLDOM".

Обновленный код:

Sub Main()
    Dim ReportFilename As String
    Dim xmlDoc As Object
    Dim xmlSourceList As Object

    ReportFilename = "C:\Temp\Report1.xml"

    xmlDoc = CreateObject("microsoft.XMLDOM")
    xmlDoc.async = False
    xmlDoc.Load(ReportFilename)

    xmlSourceList = xmlDoc.getElementsByTagName("DataSource")
    MsgBox(xmlSourceList.length)

End Sub

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...