我试图将Excel中的表格导出为XML文件。我创建了一个架构,但我没有完全符合我期望的结果。这是我的表的一个简单示例:my table。
我的架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence minOccurs="0" maxOccurs="2">
<xs:element name="Group" type="groupType" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="groupType">
<xs:sequence>
<xs:element name="City" type="cityType" />
</xs:sequence>
<xs:attribute name="name" />
</xs:complexType>
<xs:complexType name="cityType">
<xs:sequence>
<xs:element name="value" type="xs:string" />
</xs:sequence>
<xs:attribute name="name" />
</xs:complexType>
这是我导出到XML时得到的结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<list>
<Group name="groupA">
<City name="Dublin">
<value>yes</value>
</City>
</Group>
<Group name="groupA">
<City name="Prague">
<value>yes</value>
</City>
</Group>
<Group name="groupA">
<City name="Sofia">
<value>no</value>
</City>
</Group>
<Group name="groupA">
<City name="Tunis">
<value>yes</value>
</City>
</Group>
<Group name="groupB">
<City name="Paris">
<value>no</value>
</City>
</Group>
<Group name="groupB">
<City name="Lisbon">
<value>no</value>
</City>
</Group>
<Group name="groupB">
<City name="Madrid">
<value>no</value>
</City>
</Group>
</list>
它还不错,但我想在同一节点中合并具有相同组名(groupA和groupB)的行。换句话说,我希望得到这样的结果:
<list>
<Group name="groupA">
<City name="Dublin">
<value>yes</value>
</City>
<City name="Prague">
<value>yes</value>
</City>
<City name="Sofia">
<value>no</value>
</City>
<City name="Tunis">
<value>yes</value>
</City>
</Group>
<Group name="groupB">
<City name="Paris">
<value>no</value>
</City>
<City name="Lisbon">
<value>no</value>
</City>
<City name="Madrid">
<value>no</value>
</City>
</Group>
</list>
我应该如何在我的架构中做出我想要的结果?
答案 0 :(得分:1)
Excel只能以表格形式直接导出XML。这是一系列数据行(记录),其中每个数据字段只有一个元素。它无法导出列表列表。即:一个项目列表具有第二个项目列表。请参阅https://support.office.com/en-us/article/Export-XML-data-0b21f51b-56d6-48f0-83d9-a89637cd4360。
但是你想要列表清单。一系列组,每组都有一系列城市。架构将是:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="list">
<xs:complexType>
<xs:sequence>
<xs:element name="Group" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="City" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="value"/>
</xs:sequence>
<xs:attribute type="xs:string" name="name"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="name"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
但据记载,这不能直接使用Excel的XML导出功能导出。
所以我建议使用VBA。以下内容将根据显示的数据创建所需的XML。
Sub testXLStoXML()
Set oXMLDoc = CreateObject("MSXML2.DOMDocument")
Set oPI = oXMLDoc.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" standalone=""yes""")
Set oRoot = oXMLDoc.createNode(1, "list", "")
oXMLDoc.appendChild oRoot
oXMLDoc.InsertBefore oPI, oXMLDoc.ChildNodes.Item(0)
With ActiveSheet
lRow = 2
sGroupName = ""
Do While .Cells(lRow, 1).Value <> ""
sGroupName = .Cells(lRow, 1).Value
Set oElmGroup = oXMLDoc.createNode(1, "Group", "")
oXMLDoc.DocumentElement.appendChild oElmGroup
Set oAttr = oXMLDoc.createNode(2, "name", "")
oAttr.NodeValue = sGroupName
oElmGroup.setAttributeNode oAttr
Do While .Cells(lRow, 1).Value = sGroupName
Set oElmCity = oXMLDoc.createNode(1, "City", "")
Set oAttr = oXMLDoc.createNode(2, "name", "")
oAttr.NodeValue = .Cells(lRow, 2).Value
oElmCity.setAttributeNode oAttr
Set oElmValue = oXMLDoc.createNode(1, "Value", "")
oElmValue.appendChild oXMLDoc.createTextNode(.Cells(lRow, 3).Value)
oElmCity.appendChild oElmValue
oElmGroup.appendChild oElmCity
lRow = lRow + 1
Loop
Loop
End With
MsgBox oXMLDoc.XML
oXMLDoc.Save "test.xml"
End Sub
在宏运行时,带有显示数据的工作表必须是活动工作表。