Как добавить узел в XML файл с пробелами и возвратом каретки? - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь добавить узел в файл XML, но не могу понять. Любая помощь будет высоко оценена. Используя VBA, я пытаюсь добавить "<Poi />" под "<Song ..>" в моей файловой базе данных. xml - увидеть ожидаемый результат ниже

Мне удалось создать узел, но он имеет неправильное форматирование: пробелы и возврат каретки не добавляются правильно.

Вот пример:

Исходная база данных (перед использованием любого кода):

<?xml version="1.0" encoding="UTF-8"?>
<VirtualDJ_Database Version="8.4">
 <Song FilePath="\Music_Path\Author_1 - Title_1.mp3">
  <Tags Author="Author_1" Title="Title_1" Bpm="2.068965" Flag="1"/>
  <Infos SongLength="191.295000" FirstSeen="1584402618"/>
 </Song>
</VirtualDJ_Database>  

Для этой базы данных требуется: 1 пробел перед "<Song .." и 2 пробела перед остальными "<Tags ..", "<Infos..", "<Poi..."

Модифицированная база данных (после обработки кода) - Неверный результат, см. Ожидаемый результат ниже

<?xml version="1.0" encoding="UTF-8"?><VirtualDJ_Database Version="8.4">
 <Song FilePath="\Music_Path\Author_1 - Title_1.mp3">
  <Tags Author="Author_1" Title="Title_1" Bpm="2.068965" Flag="1"/>
  <Infos SongLength="191.295000" FirstSeen="1584402618"/>
 <Poi/></Song>
</VirtualDJ_Database>

Ожидаемый результат:

<?xml version="1.0" encoding="UTF-8"?>
<VirtualDJ_Database Version="8.4">  -------------------CARRIAGE RETURN BEFORE
 <Song FilePath="\Music_Path\Author_1 - Title_1.mp3">
  <Tags Author="Author_1" Title="Title_1" Bpm="2.068965" Flag="1"/>
  <Infos SongLength="191.295000" FirstSeen="1584402618"/>
  <Poi/> -----------(ADDED NODE----------------------- 2 SPACES BEFORE
 </Song> ----------------------------------------------  CARRIAGE RETURN + 1 SPACE BEFORE
</VirtualDJ_Database>

Примененный код:

Sub ADD_NODE()

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

    ------ (select a parent node)
Set ParentNode = oXMLFileMod.SelectSingleNode("/VirtualDJ_Database/Song[1]")

    ----- (add a new childNode)
Set childNode = oXMLFileMod.createElement("Poi")
ParentNode.appendChild (childNode)

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

End Sub

Как изменить код, чтобы иметь правильное форматирование ?

1 Ответ

0 голосов
/ 19 марта 2020

Для пользователей будущего, вот как я это сделал: для пробелов

Sub ADD_SPACE_BEFORE(CHEMIN_COMPLET_DB As String, SONG_NUMBER As Integer, ATTRIBUTE_NAME As String, ATTRIBUTE_NUMBER As Integer, NUMBER_OF_SPACES As Integer)

Dim xmlDoc As New MSXML2.DOMDocument60
Dim root As IXMLDOMElement
Dim MyText As IXMLDOMText
Dim MyNewNode As IXMLDOMNode
Dim SPACES As String
Dim i As Integer

xmlDoc.async = False
xmlDoc.preserveWhiteSpace = True
xmlDoc.Load "M:\VirtualDJ\database.xml"

   SPACES = ""
   For i = 0 To NUMBER_OF_SPACES - 1
        SPACES = SPACES & " "
   Next i

   Set root = xmlDoc.SelectSingleNode("/VirtualDJ_Database/Song[" & SONG_NUMBER & "]")
   Set MyText = xmlDoc.createTextNode(SPACES)
   Set MyNewNode = root.InsertBefore(MyText, root.SelectSingleNode("/VirtualDJ_Database/Song[" & SONG_NUMBER & "]/" & ATTRIBUTE_NAME & "[" & ATTRIBUTE_NUMBER & "]"))
   'MsgBox (xmlDoc.XML)

xmlDoc.Save CHEMIN_COMPLET_DB
End Sub

и для возврата каретки:

Sub ADD_CARRIAGE_RETURN(CHEMIN_COMPLET_DB As String, SONG_NUMBER As Integer, ATTRIBUTE_NAME As String, ATTRIBUTE_NUMBER As Integer, NUMBER_OF_RETURN As Integer, Optional EXTRA_SPACE As String)

Dim xmlDoc As New MSXML2.DOMDocument60
Dim root As IXMLDOMElement
Dim MyText As IXMLDOMText
Dim MyNewNode As IXMLDOMNode
Dim RETURNS As String
Dim i As Integer

xmlDoc.async = False
xmlDoc.preserveWhiteSpace = True
xmlDoc.Load "M:\VirtualDJ\database.xml"

   SPACES = ""
   For i = 0 To NUMBER_OF_RETURN - 1
        RETURNS = RETURNS & vbCrLf
   Next i
   If Not IsMissing(EXTRA_SPACE) Then RETURNS = RETURNS & " "


   Set root = xmlDoc.SelectSingleNode("/VirtualDJ_Database/Song[" & SONG_NUMBER & "]")
   Set MyText = xmlDoc.createTextNode(RETURNS)
   Set MyNewNode = root.InsertBefore(MyText, root.SelectSingleNode("/VirtualDJ_Database/Song[" & SONG_NUMBER & "]/" & ATTRIBUTE_NAME & "[" & ATTRIBUTE_NUMBER & "]"))

xmlDoc.Save CHEMIN_COMPLET_DB

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...