查找匹配&整个文件中2个plist XML文件之间的非匹配元素?
我从iOS提交了2个.plist XML;只是一个FYI。
重要的是弄清楚两个文件中存在哪些项目(应用程序),哪些不存在。
因为,它们可以存在于各种位置,任何顺序,XML结构的任何级别,使用Beyond Compare等的简单文件比较都不起作用。
当XSLT 2.0正在运行并且Saxon是唯一的兼容解析器时,我已经完成了相当多的XML / XSLT代码。我在Win 8.1上有Altova XML Spy,DiffDog。
但是,我可以使用非XML / XSL机制来确定双方/双方都缺少什么,以及两者中有什么,如果它&#39更容易。
项元素属于此类型:<string>com.apple.MobileSMS</string>
,可能存在于XML结构中的各个位置。
<array>
下的应用存在,以便进行匹配/比较<dict>
下不计入匹配/比较此处概述了有关此特定.plist XML结构的更多详细信息: http://iky1e.tumblr.com/post/11704062690/springboard-icon-layouts-iconstateplist
SpringBoard图标布局 - IconState.plist
我一直在寻找一种方法来获取所有未隐藏的应用程序列表(因此不包括Web.app之类的内容)。
虽然我找到了它((NSArray *)[[SBIconModel sharedInstance] visibleIconIdentifiers])。我还发现了一个字典SpringBoard保留了Icon布局。让我们仔细看看:
- 停靠栏图标位于键'buttonBar'的单独数组中;
- 这些网页位于关键字&gt; iconLists';
的数组中- 每个页面都是iconLists数组中的一个单独数组;
- 在每个页面的数组中,图标为字符串;
- 图标字符串是apps displayId;
- 文件夹是NSDictionary;
- 每个文件夹都有这些键;
- 一个displayName键,它是一个字符串,它的名字;
- iconLists,每个页面都有一个图标数组(displayId strings);
<!-- language-all: lang-xml -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<all>
<!-- Outer <dict> replaced by <all> -->
<key>buttonBar</key>
<array>
<string>com.apple.MobileSMS</string>
<string>com.apple.mobilemail</string>
<string>com.apple.mobilesafari</string>
</array>
<key>iconLists</key>
<pages>
<!-- replaced by <pages> -->
<page>
<!-- replaced by <page> -->
<string>com.apple.mobilephone</string>
<string>com.apple.mobilecal</string>
<string>com.apple.mobileslideshow</string>
<string>com.apple.camera</string>
<string>com.apple.videos</string>
<string>com.apple.youtube</string>
<string>com.apple.Maps</string>
<string>com.apple.weather</string>
<string>com.apple.mobilenotes</string>
<string>com.apple.reminders</string>
<string>com.apple.mobiletimer</string>
<string>com.apple.gamecenter</string>
<dict>
<!-- Inner <dict> represents Folders -->
<key>displayName</key>
<string>Apple</string>
<key>iconLists</key>
<array>
<array>
<string>com.apple.mobileme.fmf1</string>
<string>com.apple.Cards</string>
<string>com.apple.iBooks</string>
</array>
</array>
<key>listType</key>
<string>folder</string>
</dict>
<string>com.apple.MobileStore</string>
<string>com.apple.AppStore</string>
<string>com.apple.Preferences</string>
</page>
<page>
<dict>
<key>displayName</key>
<string>Utilities</string>
<key>iconLists</key>
<array>
<array>
<string>com.apple.MobileAddressBook</string>
<string>com.apple.calculator</string>
<string>com.apple.VoiceMemos</string>
</array>
</array>
<key>listType</key>
<string>folder</string>
</dict>
<dict>
<key>displayName</key>
<string>Jailbreak</string>
<key>iconLists</key>
<array>
<array>
<string>com.saurik.Cydia</string>
<string>libactivator</string>
<string>eu.heinelt.ifile</string>
<string>crash-reporter</string>
<string>com.googlecode.mobileterminal.Terminal</string>
</array>
</array>
<key>listType</key>
<string>folder</string>
</dict>
<dict>
<key>displayName</key>
<string>Social</string>
<key>iconLists</key>
<array>
<array>
<string>com.atebits.Tweetie2</string>
<string>info.colloquy.mobile</string>
<string>com.tapbots.Tweetbot</string>
</array>
</array>
<key>listType</key>
<string>folder</string>
</dict>
<dict>
<key>displayName</key>
<string>Other</string>
<key>iconLists</key>
<array>
<array>
<string>com.apple.stocks</string>
<dict>
<key>displayName</key>
<string>Newsstand</string>
<key>iconLists</key>
<array/>
<key>listType</key>
<string>newsstand</string>
</dict>
</array>
</array>
<key>listType</key>
<string>folder</string>
</dict>
<string>com.clickgamer.AngryBirds</string>
<string>com.apple.mobileipod</string>
</page>
<page>
<dict>
<key>displayName</key>
<string>Utilities</string>
<key>iconLists</key>
<array>
<array>
<string>com.apple.MobileAddressBook</string>
<string>com.apple.calculator</string>
<string>com.apple.VoiceMemos</string>
</array>
</array>
<key>listType</key>
<string>folder</string>
</dict>
<dict>
<key>displayName</key>
<string>Jailbreak</string>
<key>iconLists</key>
<array>
<array>
<string>com.saurik.Cydia</string>
<string>libactivator</string>
<string>eu.heinelt.ifile</string>
<string>crash-reporter</string>
<string>com.googlecode.mobileterminal.Terminal</string>
</array>
</array>
<key>listType</key>
<string>folder</string>
</dict>
<dict>
<key>displayName</key>
<string>Social</string>
<key>iconLists</key>
<array>
<array>
<string>com.atebits.Tweetie2</string>
<string>info.colloquy.mobile</string>
<string>com.tapbots.Tweetbot</string>
</array>
</array>
<key>listType</key>
<string>folder</string>
</dict>
<dict>
<key>displayName</key>
<string>Other</string>
<key>iconLists</key>
<array>
<array>
<string>com.apple.stocks</string>
<dict>
<key>displayName</key>
<string>Newsstand</string>
<key>iconLists</key>
<array/>
<key>listType</key>
<string>newsstand</string>
</dict>
</array>
</array>
<key>listType</key>
<string>folder</string>
</dict>
<string>com.clickgamer.AngryBirds</string>
<string>com.apple.mobileipod</string>
</page>
</pages>
</all>
</plist>
答案 0 :(得分:1)
根据您的评论,您似乎需要一个表格,其中列出了string
元素的所有唯一array
值,这两个值都出现在两个文件中,包括一个唯一的值列表第一个文件和第二个文件唯一的文件。
假设您已将这两个文件加载到名为File1
和File2
的变量中,您可以使用XPath表达式生成主要完整列表,如:
distinct-values($File1//array/string | $File2//array/string)
要测试File1
的唯一值,其中上下文项.
是主要完整列表中的值之一:
<xsl:if test=". = $File1//array/string and not(. = $File2//array/string)">
...以及File2
独有的值:
<xsl:if test=". = $File2//array/string and not(. = $File1//array/string)">
可以进一步细化这种方法,例如对列表进行排序。以上解决了您需求的核心。从那里,您可以决定如何布置值,无论是在HTML表格还是其他结构中。