【问题标题】:Parse key/value pairs from XML从 XML 解析键/值对
【发布时间】:2014-06-18 23:01:39
【问题描述】:

我希望从 iTunes 库 XML 文件中解析一些数据,为此我希望在 VBScript 中有一个优雅的解决方案来解析键/值对。这是 XML 结构:

<plist version="1.0">
    <dict>
        <dict>
            <key>1</key>
            <dict>
                <key>Location</key><string>"file1.mp3"</string>
            </dict>
            <key>2</key>
            <dict>
                <key>Location</key><string>"file2.mp3"</string>
            </dict>
        </dict>
    </dict>
</plist>

我现在只列出了两个键/值 (&lt;key&gt;/&lt;dict&gt;) 对,但当然还有很多。

我想将其解析为某种字典对象,如下所示:

1 file1.mp3
2 file2.mp3

我可以想出一些方法来实现这一点,比如涉及NextSibling() 方法,但这对我来说真的太牵强了。

那么对于这个问题,更正式/更优雅的解决方案是什么?提前致谢!

【问题讨论】:

    标签: xml vbscript xml-parsing key-value


    【解决方案1】:

    我会搜索位置,然后使用家庭关系来获取密钥和文件。在代码中:

      Dim oFS      : Set oFS      = CreateObject("Scripting.FileSystemObject")
      Dim sFSpec   : sFSpec       = goFS.GetAbsolutePathName("..\testdata\xml\so23425116.xml")
      Dim objMSXML : Set objMSXML = CreateObject("Msxml2.DOMDocument")
      objMSXML.setProperty "SelectionLanguage", "XPath"
      objMSXML.async = False
      objMSXML.load sFSpec
    
      If 0 = objMSXML.parseError Then
         Dim sXPath : sXPath     = "/plist/dict/dict/dict/key[. = ""Location""]"
         Dim ndlFnd : Set ndlFnd = objMSXML.selectNodes(sXPath)
         If 0 = ndlFnd.length Then
            WScript.Echo sXPath, "not found"
         Else
            Dim dicKV : Set dicKV = CreateObject("Scripting.Dictionary")
            Dim ndFnd, ndLoc, ndKey
            For Each ndFnd In ndlFnd
                Set ndLoc = ndFnd.nextSibling
                Set ndKey = ndFnd.parentNode.previousSibling
                WScript.Echo ndKey.text, ndLoc.text
                dicKV(ndKey.text) = ndLoc.text
            Next
            WScript.Echo "------------"
            Dim sKey
            For Each sKey In dicKV
                WScript.Echo sKey, dicKV(sKey)
            Next
         End If
      Else
         WScript.Echo objMSXML.parseError.reason
      End If
    

    示例输出(对于您的示例 .xml 的变体):

    1 "file1.mp3"
    2 "file2.mp3"
    290 file://localhost/D:/iTunes/Bob%20Russell%20Sermons/Sermons/1999/01-03%20Good%20News.mp3
    ------------
    1 "file1.mp3"
    2 "file2.mp3"
    290 file://localhost/D:/iTunes/Bob%20Russell%20Sermons/Sermons/1999/01-03%20Good%20News.mp3
    

    免责声明:

    • 我不使用iTunes,所以我不确定这2个随机选择的 我用于测试的示例 .xml 非常具有代表性。
    • 文件规范显然需要清理

    【讨论】:

    • 非常感谢您提供清晰的代码!好吧,至少我用nextSibling() 寻找了正确的方向......但仍然存在一个问题:在iTunes XML 文件中,像空格这样的字符的编码方式不同,正如您从自己的输出中看到的那样。我需要以普通字符结尾:[ 等。除了手动替换字符之外,还有什么解决方案吗?
    • 好吧,我找到了这个很棒的解决方案并使用了第三种方法:stackoverflow.com/questions/17880395/…。一切似乎运作良好。 :) 告诉我你的想法。
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多