使用 Excel VBA 解析和更新 XBA
Posted
技术标签:
【中文标题】使用 Excel VBA 解析和更新 XBA【英文标题】:XBA parsing and update with Excel VBA 【发布时间】:2021-09-13 05:36:01 【问题描述】:我正在尝试通过 Excel VBA 制作 XML 解析器/更新器。
首先,我一直在 Excel VBA 和 Python 之间来回切换,但似乎 Excel VBA 对我来说是一个更好的选择。 但是,我真的对任何方法持开放态度,所以如果有人有更好的不同建议,请告诉我。
那么,我想用这个应用程序做什么。
解析 XML 并注意 Excel 格式的信息 我需要名称和每个属性的值以及每个节点的文本值 在获取 Excel 格式的信息后,我希望能够修改值并输出回 XML 格式所以,简而言之,我猜我的目标是 XML 编辑器? 但是我从一开始就陷入了一些问题。 下面是 XML 解析部分的简要实现:
'load xml document
Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.async = False
xmlDoc.validateOnParse = False
xmlDoc.Load(xmlFilepath)
'get document elements
Set xmlDocElement = xmlDoc.DocumentElement
Debug.Print xmlDocElement.xml
For i = 0 To xmlDocElement.ChildNodes.Length - 1
Debug.Print xmlDocElement.ChildNodes(i).xml
For j = 0 To xmlDocElement.ChildNodes(i).Attributes.Length - 1
Debug.Print xmlDocElement.ChildNodes(i).Attributes.Item(j).Name
Debug.Print xmlDocElement.ChildNodes(i).Attributes.Item(j).Value
Next j
Debug.Print xmlDocElement.ChildNodes(i).Text
Next i
至少到目前为止,上述方法或多或少都运行良好,但有两种情况除外。
如果文本包含 &/>/,则无法加载 XML 文件 如果包含超过 1 个最高父节点,则无法加载 XML 文件。包含&/>/
<parenttag>
<childtag>I love mac&cheese</childtag>
</parenttag>
我在网上找到的答案很有说服力: 修改文本,使其不使用 &/>/
超过 1 个最高父节点样本:
<parenttag>
<childtag>Text</childtag>
</parenttag>
<differenttag>
<childtag>Some other text</childtag>
</differenttag>
XML 加载不适用于 1 个 XML 文件中的多个父标记。 再说一次,我无法修改 XML 文件的内容,所以我需要解决加载错误的方法。
我还想指出,我最初已经启动了这个项目 通过将 XML 文件作为文本读取并逐行处理。 但是,这不适用于多行内容 并因此试图找出一种正确处理 XML 文件的方法。
这个问题确实包含多个部分,但如果我能得到任何帮助,我将不胜感激。
【问题讨论】:
问题是任何 xml 解析器都只会接受 valid xml。而<childtag>I love mac&cheese</childtag>
只是没有有效的 xml。它应该被编码为<childtag>I love mac&amp;cheese</childtag>
这就是你需要修复的。如果每个人都遵循 xml 标准规则并生成有效的 xml,则您只能使用标准(如 xml 标准)。否则你的代码可能看起来像 xml 但它不是 xml(直到它有效)。
您好 Pᴇʜ,感谢您告知我,但我知道该示例无效。但是,我的问题是能够按原样从无效的 XML 示例中加载。这是否意味着我无法使用 DOM Document 加载为 XML 文件?
实际上问题是您的文件不是 XML,因为只有 有效 XML 是 XML(这就是它的定义方式)。你的文件不是 XML 他们是别的东西。因此,您无法使用 XML 解析器来解析它们。
【参考方案1】:
问题是任何 XML 解析器都只会接受 valid XML。和
<childtag>I love mac&cheese</childtag>
只是没有有效的 XML。它应该被编码为
<childtag>I love mac&cheese</childtag>
所以这就是你需要解决的问题。如果每个人都遵循 XML 标准规则并生成有效的 XML,那么您只能使用标准(如 XML 标准)。否则,您的代码可能看起来像 XML,但它不是 XML(直到它有效)。
XML 中也不允许有多个根元素。如果它有多个根,那么它就不是 XML。因此,要摆脱您的问题,您唯一能做的就是在将文件加载到解析器之前解决这些问题。例如,您可以添加一个根标签以使您的多个父母成为该根的孩子:
<myroot>
<parenttag>
<childtag>Text</childtag>
</parenttag>
<differenttag>
<childtag>Some other text</childtag>
</differenttag>
</myroot>
而尚未编码的&amp;
需要改为&amp;
才能生效。
唯一的其他选择是编写您自己的解析器来解析那些不是 XML 的自定义文件。但这在 2 行代码中是不可能的,因为您需要为您的 NON-XLM 文件开发一个解析器。
【讨论】:
以上是关于使用 Excel VBA 解析和更新 XBA的主要内容,如果未能解决你的问题,请参考以下文章
VBA - 从 Excel 更新 Access 文件的链接表