VBA 格式化问题处理 XML - Microsoft XML6.0

VBA Formatting issue handling XML - Microsoft XML6.0

我想在软件虚拟DJ中为我拥有的每首歌曲自动添加3个POI(兴趣点)(目标是在另一个软件中触发相应的灯光秀) 为了添加 3 个 POI,我想我需要编辑 Database.xml。我制作了一个 VBA 宏来编辑添加标签的文件,但是当我启动 Virtual DJ 时,它告诉我数据库已损坏并想要修复它,然后我添加的所有行都丢失了。我添加的内容 100% 正确(我复制了 Virtual DJ 生成的 POI)。 事实上,只有用 VBA 代码打开和关闭 Database.xml 会生成错误弹出窗口(参见下面的示例,需要启用库 "microsoft XML 6.0")

    Sub TEST_ERROR()
    Set oXMLDoc = New MSXML2.DOMDocument60
    oXMLDoc.LoadXML "M:\VirtualDJ\Database.xml"
    oXMLDoc.Save "M:\VirtualDJ\Database.xml"
    End Sub

我尝试使用 Atom 进行手动编辑,并且成功了。 (这不是一个可行的解决方案,因为我有数百首歌曲要处理) 我怀疑有两个可能的根本原因: - 使用 VBA 保存文件时的格式? - 打开 VirtualDJ 时检查数据库大小?

我对 XML 处理的了解非常基础。我很想找到愿意测试它的人。我在许多 XML 主题中搜索了解决方案,但找不到。

这是 database.xml 的示例:

<?xml version="1.0" encoding="UTF-8"?>
<VirtualDJ_Database Version="8.4">
 <Song FilePath="C:\Users\jeremie.havel\Downloads Susan Singer - Bobby&apos;s Lovin&apos; Touch.mp3" FileSize="1667629">
  <Tags Author="Susan Singer" Title="21 Bobby&apos;s Lovin&apos; Touch" Bpm="2.857143" Flag="1" />
  <Infos SongLength="104.071837" FirstSeen="1583844159" Bitrate="128" Cover="2" />
  <Scan Version="801" Bpm="0.525669" AltBpm="0.703628" Volume="0.464210" Key="Bm" Flag="32768" />
  <Poi Pos="0.586304" Type="automix" Point="realStart" />
  <Poi Pos="0.600000" Type="automix" Point="fadeStart" />
  <Poi Pos="3.942290" Type="beatgrid" />
  <Poi Pos="95.450000" Type="automix" Point="fadeEnd" />
  <Poi Pos="98.808163" Type="automix" Point="realEnd" />
  <Poi Name="My custom POI" Pos="0.586304" Num="1" Type="cue" />
  <Poi Name="My custom POI 2" Pos="0.586304" Num="2" Type="cue" />
 </Song>
 <Song FilePath="C:\Users\jeremie.havel\Downloads Elvis presley - You&apos;re The Boss.mp3" FileSize="2685767">
  <Tags Author="Elvis presley" Title="21 You&apos;re The Boss" Bpm="2.857143" Flag="1" />
  <Infos SongLength="167.706122" FirstSeen="1583844214" Bitrate="128" Cover="2" />
  <Scan Version="801" Bpm="0.541224" AltBpm="0.723401" Volume="0.540651" Key="F" Flag="32768" />
  <Poi Pos="0.158231" Type="beatgrid" />
  <Poi Pos="0.548571" Type="automix" Point="realStart" />
  <Poi Pos="1.100000" Type="automix" Point="fadeStart" />
  <Poi Pos="160.650000" Type="automix" Point="fadeEnd" />
  <Poi Pos="162.744308" Type="automix" Point="realEnd" />
 </Song>
</VirtualDJ_Database>

问题中显示的代码不会从文件加载 XML,它会加载 XML.

的字符串
oXMLDoc.LoadXML "M:\VirtualDJ\Database.xml"

并且由于文件路径无效 XML,结果无效 XML(在我的测试中,文件为空)。

改用Load方法:

oXMLDoc.Load "M:\VirtualDJ\Database.xml"

您可能想要阅读各种方法和属性。当前链接列在 Where is the documentation for MSXML API?

我找到了部分解决方案。 我的问题是我的数据库使用空格而不是制表符。 所以我想我需要使用 "preserveWhiteSpace"属性 如下所述:

Dim oXMLFileMod As MSXML2.DOMDocument60
Set oXMLFileMod = New MSXML2.DOMDocument60
oXMLFileMod.preserveWhiteSpace = True
oXMLFileMod.Load "M:\VirtualDJ\database.xml"

Perform your XML action using https://excel-macro.tutorialhorizon.com/vba-excel-update-xml-file/

   oXMLFileMod.Save "M:\VirtualDJ\database.xml"