【问题标题】:Replacing/Removing XML file lines替换/删除 XML 文件行
【发布时间】:2020-06-30 20:45:15
【问题描述】:

我在编写脚本方面还很陌生。但是我很难弄清楚如何在 VBA 中编写一个简单的宏,以允许通过删除或替换某个文本来编辑和保存多个 xml 文件。

例如,我需要从多个 XML 文件中删除 <!ENTITY % ISOEntities PUBLIC "ISO 8879-1986//ENTITIES...

另一件事是我需要在同一个 XML 文件中将“&deg”替换为“°deg”。

感谢您的帮助。

【问题讨论】:

  • 你的问题是什么?
  • 我的问题是已经有一个宏脚本可以在不打开文件的情况下删除 xml 文件文本或更新 xml 文件中的某些单词。
  • 那么,你的帖子为什么不问这个?
  • 对不起。我虽然在我的第二句话中很清楚。
  • 那里已经有宏脚本了 ... StackOverflow 既不为您提供也不搜索脚本。请参阅How to AskHow much research effort is expected of Stack Overflow users?

标签: xml vba


【解决方案1】:

关于 XML 文档需要注意的重要一点是它们是结构化数据。尝试简单地通过文本替换来更改 XML 可能会导致 XML 格式错误。以下面的 XML 元素为例:

<test>1 is lower than 2 and 3 is greater than 2</test>

用“”替换“大于”会产生以下结果:

<test>1 < 2 and 3 > 2</test>

现在您的 XML 语法被破坏了,因为字符 &lt;&gt; 用于标记。 XML 解析器将不再知道它是作为简单文本还是元素声明的一部分。因此,为了将它们用作纯文本,它们应该由实体引用表示:

<test>1 &lt; 2 and 3 &gt; 2</test>

读取上述内容的 XML 解析器会进行必要的替换,如果你问它 &lt;test&gt; 元素的文本内容是什么,它会回复 1 &lt; 2 and 3 &gt; 2

我的意思是,操作 XML 输入的正确方法是使用“理解”XML 标记的库。对于 VBA,您可以使用 MSXML。信息可以在这里找到:https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms763742(v=vs.85)?redirectedfrom=MSDN

MSXML 支持的一些选项可用于删除某些节点或进行文本替换:

  • 使用SAX2,用于 XML 解析的简单 API。 SAX 使用基于事件的方法,其中解析 XML 生成“事件”,例如元素的开始、文本数据、处理指令等。您可以检查事件的类型,进行必要的调整(例如,如果它是文本事件必要的替换,对于某些处理指令,只需将它们完全排除在外),然后将修改后的事件提供给输出更新的 XML 文件的写入器。这是相当低级的,但可以非常快速地运行并且没有太多的内存开销。
  • 使用DOM。 “文档对象模型”是 XML 文档的内存表示。您可以遍历 XML 节点树,然后根据需要进行操作:删除、添加、替换......它通常比 SAX 更直观,但缺点是整个文件将被读取到内存中,模型开销很大。这可能不适用于较大的文档。
  • 使用XSLT。这是一种用于 XML 输入的转换语言。 XSLT 文件本身是用 XML 编写的。它们描述了 XML 输入是如何转换的,并且可以将输出创建为 XML、HTML 或纯文本。要了解 XSLT 本身需要一些额外的学习,但是那里有很多资源,包括 StackOverflow 上的大量相关问题。使用 XSLT 过滤掉某些节点和进行文本替换都非常简单,而且通常速度非常快且内存效率很高。这将是最高级别的方法。

主要的一点是,以上所有内容将确保您输出格式良好的 XML,并且这些技术旨在用于读取和操作 XML 文档。我建议您查看 MSXML 并尝试使用这些 API 和一个简单的输入文档,以了解可能的情况和您喜欢的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 2014-03-11
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多