Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不知道模式XPath的情况下,自动将Excel XmlMap映射到VBA中的工作表_Xml_Excel_Vba_Xpath - Fatal编程技术网

在不知道模式XPath的情况下,自动将Excel XmlMap映射到VBA中的工作表

在不知道模式XPath的情况下,自动将Excel XmlMap映射到VBA中的工作表,xml,excel,vba,xpath,Xml,Excel,Vba,Xpath,我正在构建一个从API下载的Excel文件 它可以从URL模式元数据自动生成XmlMap。但是,我需要将XmlMap元素映射到ListObjects,以便提取数据并将其放在工作表上 执行此操作的代码是每个项的range.Xpath.SetValue映射Xpath(从): Sub-CreateXMLList() Dim mapContact作为XmlMap 将strXPath设置为字符串 将联系人设置为ListObject Dim objNewCol作为列表列 '指定要使用的架构映射。 设置map

我正在构建一个从API下载的Excel文件

它可以从URL模式元数据自动生成XmlMap。但是,我需要将XmlMap元素映射到ListObjects,以便提取数据并将其放在工作表上

执行此操作的代码是每个项的
range.Xpath.SetValue映射Xpath
(从):

Sub-CreateXMLList()
Dim mapContact作为XmlMap
将strXPath设置为字符串
将联系人设置为ListObject
Dim objNewCol作为列表列
'指定要使用的架构映射。
设置mapContact=ActiveWorkbook.XmlMaps(“联系人”)
'创建一个新列表。
设置lstContacts=ActiveSheet.ListObjects.Add
'指定要映射的第一个元素。
strXPath=“/Root/Person/FirstName”
'映射元素。
ListContacts.ListColumns(1).XPath.SetValue映射联系人,strXPath
'指定要映射的第二个元素。
strXPath=“/Root/Person/LastName”
'将列添加到列表中。
设置objNewCol=lstContacts.ListColumns.Add
'映射元素。
objNewCol.XPath.SetValue映射联系人,strXPath
strXPath=“/Root/Person/Address/Zip”
设置objNewCol=lstContacts.ListColumns.Add
objNewCol.XPath.SetValue映射联系人,strXPath
端接头
以下是模式输出:


以下是数据(如果使用GUI,Excel将从中自动获取模式并创建XmlMap):


组织
调查
组织
另一项调查
但是,我不想指定XPath字符串-我希望Excel从模式元数据中获取所有内容,就像使用GUI功能(数据、获取外部数据、来自其他源、XML、粘贴URL)一样-这会自动创建XML映射,在工作表上创建ListObject,映射源数据中的每一列,并获取和显示数据。(如果录制执行此操作的宏,它将跳过映射步骤。)

  • 我可以将XmlMap指向单元格、范围或列表对象吗
  • 我可以迭代XmlMap并检索每个列表项吗
  • 还有别的办法吗
要进行实验/复制,请将上述XML另存为文件,然后创建一个子文件,如下所示:

Set currentMap=ActiveWorkbook.XmlMaps.Add(“C:\path\to\schema.xml”,“root”)
currentMap.DataBinding.LoadSettings“path\to\data.xml”
'执行某些操作以将XmlMap元素映射到电子表格中的单元格
'例如,objNewCol.XPath.SetValue currentMap,“根/数据\源\组织”
'但是有些方法不涉及命名Xml路径,而是迭代模式
currentMap.DataBinding.Refresh

如果XmlMap映射到单元格,这些单元格将填充数据。

这里是动态确定列名的起点。它在即时窗口中打印关于每个节点的一些信息。需要进一步开展工作,以有意义的方式提取列的名称:

Sub-createxsd()
作为整数的Dim i
对于i=ActiveWorkbook.XmlMaps.Count到1步骤-1“删除所有XML映射-以建立干净的测试环境”
ActiveWorkbook.XmlMaps(i).删除
下一个
ActiveSheet.Cells.Clear
作为字符串的Dim strMyXml
strMyXml=“”_
& "" _
&“文本”_
&“文本”_
&“文本”_
& "999" _
& "" _
& "" _
& ""
Application.DisplayAlerts=False“关闭警告消息”
将myMap设置为XmlMap
Set myMap=thiswoolk.XmlMaps.Add(strMyXml)'这将创建可以保存在XSD文件中的文本
“试试这个
'设置myMap=ThisWorkbook.XmlMaps.Add('https://maps.googleapis.com/maps/api/geocode/xml?address=90210")
Application.DisplayAlerts=True
Dim myXSD作为字符串
myXSD=ThisWorkbook.XmlMaps(1).Schemas(1).xml的XSD文本
调试。打印vbCrLf和字符串(50,“*”)和vbCrLf
调试。打印myXSD&vbCrLf&String(50,“-”&vbCrLf)
'MsgBox myXSD
' ---------------------------------------------------------------
'将节点变暗为IXMLDOMNode
“Dim nList作为IXMLDOMNodeList
'将nSel设置为IXMLDOMSelection
Dim xmlDoc作为DOMDocument
设置xmlDoc=newdomdocument
xmlDoc.LoadXML myXSD
printElement xmlDoc.ChildNodes,1'在即时窗口中打印内容(按ctrl-G查看)
调试。打印vbCrLf和字符串(50,“*”)和vbCrLf
'Set node=xmlDoc.SelectSingleNode(“xsd:schema”)
'Set nList=xmlDoc.SelectNodes(“xsd:schema”)
'Set node=xmlDoc.SelectSingleNode(“xsd:element”)
'Set-nSel=xmlDoc.getElementsByTagName(“xsd:element”)
'Set nList=xmlDoc.SelectSingleNode(“xsd:schema”).SelectNodes(“xsd:element”)
停止“查看工作簿中的xml源”
我的地图。删除
设置myMap=Nothing
端接头
'
子打印元素(L为IXMLDOMNodeList,lev为整数)
Dim cN作为对象,i作为整数
对于L中的每个cN
调试。打印vbCrLf和“级别:”&lev;
调试打印页签(lev*2+10);cN.tagName;'缩进每个级别(tab()从行的开始测量)
如果(cN.tagName=“xsd:element”),则
对于i=1到cN.Attributes.Length
调试打印选项卡(lev*2+14);cN.Attributes(i-1).Name和String(2,vbTab)以及cN.Attributes(i-1).Value
接下来我
如果结束
printElement cN.ChildNodes,lev+1
下一个cN
端接头
'

这里是动态确定列名的起点。它在即时窗口中打印关于每个节点的一些信息。需要进一步开展工作,以有意义的方式提取列的名称:

Sub-createxsd()
作为整数的Dim i
因为我=
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Root>
  <EmployeeInfo>
    <Name>Jane Winston</Name>
    <Date>2001-01-01</Date>
    <Code>0001</Code>
  </EmployeeInfo>
  <ExpenseItem>
    <Date>2001-01-01</Date>
    <Description>Airfare</Description>
    <Amount>500.34</Amount>
  </ExpenseItem>
  <ExpenseItem>
    <Date>2001-01-01</Date>
    <Description>Hotel</Description>
    <Amount>200</Amount>
  </ExpenseItem>
</Root>
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Root">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element minOccurs="0" maxOccurs="1" name="EmployeeInfo">
          <xsd:complexType>
            <xsd:all>
              <xsd:element minOccurs="0" maxOccurs="1" name="Name" />
              <xsd:element minOccurs="0" maxOccurs="1" name="Date" />
              <xsd:element minOccurs="0" maxOccurs="1" name="Code" />
            </xsd:all>
          </xsd:complexType>
        </xsd:element>
        <xsd:element minOccurs="0" maxOccurs="unbounded" name="ExpenseItem">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Date" type="xsd:date"/>
              <xsd:element name="Description" type="xsd:string"/>
              <xsd:element name="Amount" type="xsd:decimal" />
            </xsd:sequence>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="*">
        <xsl:element name="{name()}">
            <xsl:apply-templates select="node()" />
        </xsl:element>
    </xsl:template>    
</xsl:stylesheet>