Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XPath解析Java iTunes XML库_Java_Xml_Parsing_Xpath_Itunes - Fatal编程技术网

使用XPath解析Java iTunes XML库

使用XPath解析Java iTunes XML库,java,xml,parsing,xpath,itunes,Java,Xml,Parsing,Xpath,Itunes,因此,我试图创建一个方法,允许我输入一个曲目ID,然后返回属于该曲目ID的曲目名称 我需要使用XPath将XML文档解析为java,java反过来将序列化一个新库。下面是我的XML文档示例: <plist version="1.0"> <dict> <key>Major Version</key> <integer>1</integer> <key>Mino

因此,我试图创建一个方法,允许我输入一个曲目ID,然后返回属于该曲目ID的曲目名称

我需要使用XPath将XML文档解析为java,java反过来将序列化一个新库。下面是我的XML文档示例:

<plist version="1.0">
    <dict>
        <key>Major Version</key>
        <integer>1</integer>
        <key>Minor Version</key>
        <integer>1</integer>
        <key>Date</key>
        <date>2015-03-16T15:04:23Z</date>
        <key>Application Version</key>
        <string>12.1.0.71</string>
        <key>Features</key>
        <integer>5</integer>
        <key>Show Content Ratings</key>
        <true/>
        <key>Music Folder</key>
        <string>
        file://localhost/C:/Users/Mark/Music/iTunes/iTunes%20Media/
        </string>
        <key>Library Persistent ID</key>
        <string>3B01AE08EA513C21</string>
        <key>Tracks</key>
        <dict>
            <key>646</key>
            <dict>
            <key>Track ID</key>
            <integer>646</integer>
            <key>Name</key>
            <string>Save Me</string>
            <key>Artist</key>
            <string>Avenged Sevenfold</string>
            <key>Album Artist</key>
            <string>Avenged Sevenfold</string>
            <key>Album</key>
            <string>Nightmare</string>
            <key>Genre</key>
            <string>Metal</string>
            <key>Kind</key>
            <string>MPEG audio file</string>
            <key>Size</key>
            <integer>23257166</integer>
            <key>Total Time</key>
            <integer>656535</integer>
            <key>Disc Number</key>
            <integer>1</integer>
            <key>Disc Count</key>
            <integer>1</integer>
            <key>Track Number</key>
            <integer>11</integer>
            <key>Track Count</key>
            <integer>11</integer>
            <key>Year</key>
            <integer>2010</integer>
            <key>Date Modified</key>
            <date>2012-10-21T22:07:20Z</date>
            <key>Date Added</key>
            <date>2012-10-21T22:07:20Z</date>
            <key>Bit Rate</key>
            <integer>276</integer>
            <key>Sample Rate</key>
            <integer>44100</integer>
            <key>Play Count</key>
            <integer>2</integer>
            <key>Play Date</key>
            <integer>3415934327</integer>
            <key>Play Date UTC</key>
            <date>2012-03-30T06:38:47Z</date>
            <key>Artwork Count</key>
            <integer>1</integer>
            <key>Persistent ID</key>
            <string>0000000000001389</string>
            <key>Track Type</key>
            <string>File</string>
            <key>Location</key>
            <string>
            file://localhost/C:/Users/Mark/Music/Avenged%20Sevenfold/Nightmare/11%20-%20Save%20Me.mp3
            </string>
            <key>File Folder Count</key>
            <integer>2</integer>
            <key>Library Folder Count</key>
            <integer>1</integer>
        </dict>
        <key>648</key>
        <dict>
            <key>Track ID</key>
            <integer>648</integer>
            <key>Name</key>
            <string>Welcome 2 Hell</string>
            <key>Artist</key>
            <string>Bad Meets Evil</string>
            <key>Album Artist</key>
            <string>Bad Meets Evil</string>
            <key>Composer</key>
            <string>Havoc, Magnedo7</string>
            <key>Album</key>
            <string>Hell: The Sequel (Deluxe Edition)</string>
            <key>Genre</key>
            <string>Rap</string>
            <key>Kind</key>
            <string>MPEG audio file</string>
            <key>Size</key>
            <integer>7467977</integer>
            <key>Total Time</key>
            <integer>177606</integer>
            <key>Track Number</key>
            <integer>1</integer>
            <key>Year</key>
            <integer>2011</integer>
            <key>Date Modified</key>
            <date>2012-10-21T22:07:20Z</date>
            <key>Date Added</key>
            <date>2012-10-21T22:07:20Z</date>
            <key>Bit Rate</key>
            <integer>320</integer>
            <key>Sample Rate</key>
            <integer>44100</integer>
            <key>Play Count</key>
            <integer>3</integer>
            <key>Play Date</key>
            <integer>3424485861</integer>
            <key>Play Date UTC</key>
            <date>2012-07-07T06:04:21Z</date>
            <key>Skip Count</key>
            <integer>2</integer>
            <key>Skip Date</key>
            <date>2012-11-26T14:02:44Z</date>
            <key>Artwork Count</key>
            <integer>1</integer>
            <key>Persistent ID</key>
            <string>000000000000138A</string>
            <key>Track Type</key>
            <string>File</string>
            <key>Location</key>
            <string>
            file://localhost/C:/Users/Mark/Music/Bad%20Meets%20Evil/Hell_%20The%20Sequel%20(Deluxe%20Edition)/01%20-%20Welcome%202%20Hell.mp3
            </string>
            <key>File Folder Count</key>
            <integer>2</integer>
            <key>Library Folder Count</key>
            <integer>1</integer>
        </dict>
</plist>
任何帮助都将不胜感激

编辑:

使用Mathias Müller的建议产生了正确的结果,如预期的那样,第646轨道“保存我”。但是,当我输入另一个曲目ID时,它也会返回“Save Me”,这是不正确的

我不知道它为什么这样做,因为我以为它只会返回我输入的ID的曲目名称,但它会返回不同的曲目名称

第二次编辑:

-包含了更多的XML

第三次编辑:


使用Mathias的建议,将XPath表达式更改为
//dict[integer=“+id+”]/string[1]/text()
。这工作得很好。

我无法对Java代码进行评论,但我可以向您解释应该使用的XPath表达式。假设您显示的输入示例,应用

//dict[key='646']/dict/key[. = 'Name']/following-sibling::*[1]
会回来的

<string>Save Me</string>
结果将是

Save Me
路径表达式的工作原理如下:

//dict                    select `dict` elements anywhere in the document
[key='646']               but only if they have an immediate child `key` whose text
                          content is equal to "646"
/dict                     select their child elements called `dict`
/key[. = 'Name']          of those `dict` elements select their child elements `key`,
                          but only if their text content is equal to "Name"
/following-sibling::*[1]  of those `key` elements, select the first following sibling
                          element
/text()                   and select its text content

原始表达式依赖于
字符串
元素的位置,也可以进行细微的更改:

//dict[key ="646"]/dict/string[1]/text()

您的解决方案部分有效,解释得很好,但当我搜索其他曲目ID时,它仍然返回曲目名称为“Save Me”,而它不应该返回。您有什么建议吗?@user3068854当然,但您需要显示输入文档的更多内容。包含多个曲目的示例。我假设您没有在表达式中硬编码ID值?更新了XML以显示前两个轨迹。我尝试对ID进行硬编码,结果也一样。请原谅任何不正确的缩进,该文件对我来说非常难以正确读取。@user3068854不,我的意思是对ID值进行硬编码是错误的;)。您的新XML示例格式不正确,也不清楚应该如何更正,但我提出的表达式很可能现在会返回两个结果,都是跟踪名称字符串,而不管ID如何。如果您仍然需要帮助,请确保您的示例格式正确(即,正确关闭位于正确位置的
dict
元件)。再次感谢您的帮助,我通过在其他地方搜索曲目ID并使用您提供的语法,成功地识别了曲目名称。是因为我,还是iTunes库XML文件真的很难读取?我的库有9000首曲目,我很难找到dict元素的结尾和新曲目的开始位置。也许是我在直截了当地?
//dict                    select `dict` elements anywhere in the document
[key='646']               but only if they have an immediate child `key` whose text
                          content is equal to "646"
/dict                     select their child elements called `dict`
/key[. = 'Name']          of those `dict` elements select their child elements `key`,
                          but only if their text content is equal to "Name"
/following-sibling::*[1]  of those `key` elements, select the first following sibling
                          element
/text()                   and select its text content
//dict[key ="646"]/dict/string[1]/text()