0

我正在尝试修改以下形式的 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

但我似乎无法选择关联的兄弟节点(尝试followingSiblingAxismoveUp >>> getChildren),这将允许我操作所需的节点。NavigatableTree与和之间的区别是否有问题NTree?我所在的show节点NTree (XText "software-package") []]

如果任何答案假设对箭头的接触非常有限,那真的会对我有所帮助。

谢谢。

4

1 回答 1

0

我以不同的方式解决了这个问题。它感觉不那么健壮(匹配 的子字符串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 node
于 2018-07-27T10:22:07.237 回答