我正在尝试修改以下形式的XML文件:
<plist version="1.0">
<dict>
<key>items</key>
<array>
<dict>
<key>assets</key>
<array>
<dict>
<key>kind</key>
<string>software-package</string>
<key>url</key>
<string>https://s3.xyz.amazonaws.com/xyz/xyz.ipa</string>
</dict>
<dict>
<key>kind</key>
<string>display-image</string>
<key>url</key>
<string>https://s3.xyz.amazonaws.com/xyz/xyz.57x57.png</string>
</dict>
</array>
</dict>
</array>
</dict>
我想修改节点<string>https://s3.xyz.amazonaws.com/xyz/xyz.ipa</string>的内容
我可以找到相关的同级节点,如下所示
import Text.XML.HXT.Core
main = do
plistString <- readFile "manifest.plist"
let plistDoc = readString [withValidate no, withSubstDTDEntities no] plistString
node <- runX $ plistDoc >>> deep (hasText ( == "software-package"))
print node但是我似乎无法选择相关的同级节点(尝试使用followingSiblingAxis和moveUp >>> getChildren),这将允许我操作所需的节点。这与NavigatableTree和NTree之间的区别有关吗;节点I'm shows as NTree (XText "software-package") []]
如果任何答案都假设对箭头的接触非常有限,这对我真的很有帮助。
谢谢。
发布于 2018-07-27 18:22:07
我用一种不同的方式解决了这个问题。它感觉不是很健壮(匹配xyz.ipa的子字符串),但在我等待灵感的时候,它解除了我的障碍:
import Text.XML.HXT.Core
import Data.Char (toUpper)
uppercase = map toUpper
main = do
plistString <- readFile "manifest.plist"
let plistDoc = readString [withValidate no, withSubstDTDEntities no] plistString
node <- runX . xshow $ plistDoc >>> processTopDown (ifA (hasText ( isInfixOf "xyz.ipa")) (changeText uppercase) (this))
print nodehttps://stackoverflow.com/questions/51521052
复制相似问题