我正在尝试使用 XPath 键规范在
.plist
文件中添加/更新属性。我已经使用如下所示的文件进行了测试:
<?xml version="1.0"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="1.0">
<dict>
<key>testProp</key>
<array>
<string>text</string>
<string>54</string>
<string>2023-11-09T16:29:34Z</string>
</array>
<key>objectProp</key>
<array>
<string>text</string>
<integer>54</integer>
<date>2023-11-09T16:29:34Z</date>
</array>
</dict>
</plist>
和一个像这样构建的
XMLPropertyListConfiguration
对象:
File file = new File("path/to/config.plist");
XMLPropertyListConfiguration configuration =
new FileBasedConfigurationBuilder<>(XMLPropertyListConfiguration.class)
.configure(new Parameters().xml()
.setFile(file)
.setExpressionEngine(new XPathExpressionEngine()))
.getConfiguration();
// do any changes, then save the file using:
FileHandler handler = new FileHandler(configuration);
handler.save(file);
我的目标:编辑数组属性之一中的值,或将新值插入数组中。我原以为
configuration.setProperty("/testProp[2]", "a different string")
会导致以下结果(为了简洁起见,删除了一些部分):
<key>testProp</key>
<array>
<string>text</string>
<string>a different string</string>
<string>2023-11-09T16:29:34Z</string>
</array>
而是添加了
testProp[2]
作为自己的属性:
<?xml version="1.0"?>
<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
<plist version="1.0">
<dict>
<key>testProp</key>
<array>
<string>text</string>
<string>54</string>
<string>2023-11-09T16:29:34Z</string>
</array>
<key>objectProp</key>
<array>
<string>text</string>
<integer>54</integer>
<date>2023-11-09T16:29:34Z</date>
</array>
<key>testProp[2]</key>
<string>a different string</string>
</dict>
</plist>
我的理解是,您使用
testProp[n]
谓词来指定 testProp
的第 n 个属性/值,但显然这里的情况并非如此。我对数组有什么特别遗漏的吗?或者我是否必须将 testProp
读取为 List
,修改列表,然后将整个列表另存为 testProp
?我正在寻找的最佳解决方案是可以在 XPath 字符串中包含所有相关信息,但如果我需要单独处理数组中的索引,也可以处理。
也许尝试使用路径
/testProp/array[2]
而不是 /testProp[2]
。