使用 XMLPropertyListConfiguration 和 XPathExpressionEngine 在数组中设置/添加属性

问题描述 投票:0回答:1

我正在尝试使用 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 字符串中包含所有相关信息,但如果我需要单独处理数组中的索引,也可以处理。

java xpath plist apache-config
1个回答
0
投票

也许尝试使用路径

/testProp/array[2]
而不是
/testProp[2]

© www.soinside.com 2019 - 2024. All rights reserved.