为什么getElementsByTagName找不到元素?

时间:2019-05-07 11:54:16

标签: xml vba dom

我是处理XML文档和Microsoft DOM的新手,如果我遗漏了一些明显的内容,我深表歉意。

我有一组XML格式的文档,最终我希望以编程方式进行编辑。作为发现步骤,我试图打开一个文件,并查看如何读取其内容。

以下是我在网上找到的示例,我在Visual Studio 2019中创建了一个控制台项目并编写了几行代码。

文档包含元素“ DataSource”的2个实例,但是方法getElementsByTagName(“ DataSource”)似乎找不到它们。确实,无论我给命令加上什么标签,元素数组的长度总是返回为0。

我在做什么错了?

MY 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 :(得分:0)

我注意到的一个错误是您的路径"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

希望这会有所帮助。

答案 1 :(得分:0)

元素位于命名空间(http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition)中,因此您应使用getElementsByTagName(uri, localname)的两个参数形式来提供命名空间。