使用 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。而&lt;childtag&gt;I love mac&amp;cheese&lt;/childtag&gt; 只是没有有效的 xml。它应该被编码为&lt;childtag&gt;I love mac&amp;amp;cheese&lt;/childtag&gt; 这就是你需要修复的。如果每个人都遵循 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&amp;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;需要改为&amp;amp;才能生效。

唯一的其他选择是编写您自己的解析器来解析那些不是 XML 的自定义文件。但这在 2 行代码中是不可能的,因为您需要为您的 NON-XLM 文件开发一个解析器。

【讨论】:

以上是关于使用 Excel VBA 解析和更新 XBA的主要内容,如果未能解决你的问题,请参考以下文章

VBA Excel - 访问查询不可更新

VBA Excel ADO SQL 更新查询不起作用

VBA - 从 Excel 更新 Access 文件的链接表

如何使用 VBA 更新 Excel 工作簿 Web 查询连接字符串?

更新/编辑数据 - VBA Excel

Excel、VBA、PowerPivot、DataFeed 连接 - 更新文件路径