Estoy tratando de cambiar un valor en un array usando plutil
, pero me sale el error
Failed to insert value new value 2 at key path PARENT.0.KEY_IN_ARRAY with error -[__NSCFConstantString characterAtIndex:]: Range or index out of bounds
Aquí hay un ejemplo de plist para ilustrar el problema:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SIMPLE</key>
<string>value1</string>
<key>PARENT</key>
<array>
<dict>
<key>KEY_IN_ARRAY</key>
<string>value2</string>
</dict>
<dict>
<key>KEY_IN_ARRAY</key>
<string>value3</string>
</dict>
</array>
</dict>
</plist>
Modificar el valor de SIMPLE es fácil:
$ plutil -extract SIMPLE xml1 -o - sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<string>value1</string>
</plist>
$ plutil -replace SIMPLE -string "new value 1" sample.plist
$ plutil -extract SIMPLE xml1 -o - sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<string>new value 1</string>
</plist>
Obtener el valor del array funciona bien:
$ plutil -extract PARENT.0.KEY_IN_ARRAY xml1 -o - sample.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<string>value2</string>
</plist>
pero me sale el error cuando intento modificar este valor:
$ plutil -replace PARENT.0.KEY_IN_ARRAY -string "new value 2" sample.plist
sample.plist: Could not modify plist, error: Failed to insert value new
value 2 at key path PARENT.0.KEY_IN_ARRAY with error -[__NSCFConstantString
characterAtIndex:]: Range or index out of bounds
1 votos
Esto parece ser un error.
-extract
obras y-insert
falla con el esperado denuncia de la llave ya existente; mientras tanto-replace
y-remove
golpeó esta extraña cadenacharacterAtIndex:
¡cosa!0 votos
Creo que la pregunta necesita una pequeña reformulación, ya que lo que intentas reemplazar NO es un "valor en un Array" porque el "valor" en el "array" es en realidad un Diccionario completo. Usted intenta reemplazar sólo la CLAVE del diccionario que está almacenada en el array