XML文件的输出仅显示字节顺序标记。

16 浏览
0 Comments

XML文件的输出仅显示字节顺序标记。

我有一个XML文件,我正在尝试解析它,其内容完全如下所示的XML:


  {REFERENCE-HERE}
  Filler
  
    ABC
    012345
  
  
     
      Filler2
      Filler2
      Filler2 
     
      
       Filler2
       Filler2
       Filler2 
     
   

我一直在尝试使下面的代码(最初来自我在这里的问题)工作。其他用户(包括代码的创建者)已经成功使用它,但当我运行它时,输出文件只是ÿþ<。我确保将文件编码为ANSI,并立即将记事本文件保存为.xml,但输出仍然只有字节顺序标记。

Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub ParseResults()
'需要对Microsoft XML、v6.0进行引用
'需要对Microsoft Scripting Runtime进行引用
Dim xmlFilePath$, newFilePath$
Dim DOM As MSXML2.DOMDocument
Dim entity As IXMLDOMNode
Dim fso As Scripting.FileSystemObject
'# 定义要加载为XML的文件
xmlFilePath = "路径"
'# 定义修改后的XML的输出路径
newFilePath = "新路径"
'# 创建DOM对象
Set DOM = CreateObject("MSXML2.DOMDocument")
'# 加载XML文件
DOM.Load xmlFilePath
'# 等待文档加载完成
Do
    Sleep 250
Loop Until DOM.readyState = 4
'# 获取entityID节点
Set entity = DOM.DocumentElement.getElementsByTagName("entityId")(0)
'# 调用子例程将entity附加到"Item"标签
AppendEntity DOM, "Item", entity
'# 调用子例程将entity附加到"AnotherItem"标签
AppendEntity DOM, "AnotherItem", entity
'## 创建FSO以写入新文件
Set fso = CreateObject("Scripting.FileSystemObject")
'## 尝试将新/修改后的XML写入文件
On Error Resume Next
fso.CreateTextFile(newFilePath, True, True).Write DOM.XML
If Err Then
    '## 在VBE的即时窗口中打印新XML
    Debug.Print DOM.XML
    MsgBox "无法写入" & newFilePath & ",请在VBE的即时窗口中查看XML。", vbInformation
    Err.Clear
End If
On Error GoTo 0
'清理
Set DOM = Nothing
Set fso = Nothing
Set entity = Nothing
End Sub
Sub AppendEntity(DOM As Object, tagName As String, copyNode As Object)
'## 此子例程将子节点附加到与特定字符串标签匹配的所有XML节点。
Dim itemColl As IXMLDOMNodeList
Dim itm As IXMLDOMNode
'# 获取与tagName匹配的所有元素的集合
Set itemColl = DOM.DocumentElement.getElementsByTagName(tagName)
'# 遍历集合,附加复制的节点
For Each itm In itemColl
    If itm.HasChildNodes Then
        '# 在Item的第一个子节点之前插入此节点
        itm.InsertBefore copyNode.CloneNode(True), itm.FirstChild
    Else
        '# 将此节点追加到Item
        itm.appendChild copyNode.CloneNode(True)
    End If
Next
Set itm = Nothing
Set itemColl = Nothing
End Sub

确保代码没有产生错误 - 它创建了一个新文件,但它创建的文件是不正确的。正确的输出应该是(对于一些其他尝试该代码的人来说是这样的):


  {REFERENCE-HERE}
  Filler
  
    ABC
    012345
  
  
    
      012345
      Filler2
      Filler2
      Filler2 
     
      
       012345
       Filler2
       Filler2
       Filler2 
     
   

也就是说,代码将作为每个标签的子节点插入。在我成功运行该代码后,我打算将其应用于实际的XML文档,该文档与上述示例XML类似,但包含多个实体。例如:

   
      {REFERENCE-HERE}
      Filler
      
        ABC
        012345
      
      
        
          012345
          Filler2
          Filler2
          Filler2 
         
          
           012345
           Filler2
           Filler2
           Filler2 
         
       
     
      DEF
        678910
      
      
        
          678910
          Filler2
          Filler2
          Filler2 
         
          
           678910
           Filler2
           Filler2
           Filler2 
         
          

非常感谢您提供故障排除此问题的任何帮助。

0
0 Comments

XML文件输出只显示字节顺序标记(Byte Order Mark)的原因是使用了错误的文件编码方式。解决方法是在创建文本文件时指定正确的文件编码方式。

在给出的代码中,有两种方法可以尝试解决这个问题。第一种方法是在创建文本文件时使用`CreateTextFile`方法,并将第三个参数设置为`False`,表示创建ASCII编码的文件。第二种方法是使用`CreateTextFile`方法的另一种语法,将第三个参数设置为`True`,表示创建Unicode编码的文件。

此外,还需要注意代码中关于XML元素的嵌套关系。代码中通过遍历XML中的`entityId`标签来修改`Item`标签及其子节点,将`entityId`标签添加到`Item`标签中。

通过使用上述方法,可以正确地输出XML文件,并且在打开文件时不再只显示字节顺序标记。

0