使用.xml文件中的值更新.properties文件 - 问题

时间:2017-11-27 12:49:11

标签: xml shell properties xmlstarlet

关注Update .properties file with values from .xml file我遇到以下问题:

问题1 :示例:X.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DOC SYSTEM "ts.dtd">
<?xml-stylesheet type="text/css" href="ts.css"?>
<DOC> 
    <PTXT ID="a.b.c.d" CONTEXT="label"><NTI>Text</NTI></PTXT>
</DOC>

Y.properties:

a.b.c.d=Text

我的输出是:

a.b.c.d=
    Text=
=

你能不能帮助我,因为我真的不明白发生了什么。

问题2 :示例:X.xml

my.id = \u00D6ffnen Express WebTools

和Y.properties

<PTXT ID="my.id" CONTEXT="">Öffnen <NTI>Express WebTools</NTI></PTXT> 

导致:out.properties

my.id=Öffnen Express WebTools
my.id=\u00D6ffnen Express WebTools

而不是

my.id=Öffnen Express WebTools

更新

  • 我的所有文件都包含嵌套的NTI,没有NTI和嵌套了NTI的文本。
  • 我无法加入以=结尾的字符串作为janos建议,因为我的输出类似于:

    first.id = second.id =来自第二个id的文本    第一个id =的文字 我不知道stackoverflow有什么问题,但它似乎没有把我的代码视为代码....

1 个答案:

答案 0 :(得分:0)

给出您的示例XML文件,以及此命令:

xmlstarlet fo --dropdtd "$file" | xmlstarlet sel -t -m "/DOC/PTXT" -v $'concat(@ID, "=", ., "\n")'

我得到了这个输出:

a.b.c.d=
    Text

concat的{​​{1}}中如果我将xmlstarlet更改为.,我会得到输出:

./NTI

所以我看到了两个选项。 如果您的某些输入文件包含a.b.c.d=Text 和其他输入文件,则不要 并且没有混合NTI存在和不存在的输入文件, 然后你可以添加一个条件来检测文件是否包含嵌套的NTI,并相应地使用不同的NTI命令。 例如:

xmlstarlet

如果单个XML文件可能包含这两种结构, 嵌套的NTI,没有嵌套的NTI, 然后另一种选择是使用if xmlstarlet fo --dropdtd "$file" | xmlstarlet el | grep -q DOC/PTXT/NTI; then cmd=$'concat(@ID, "=", ./NTI, "\n")' else cmd=$'concat(@ID, "=", ., "\n")' fi xmlstarlet fo --dropdtd "$file" | xmlstarlet sel -t -m "/DOC/PTXT" -v "$cmd" , 但是处理输出,将以$'concat(@ID, "=", ., "\n")'结尾的行与下一行连接起来。

如果您需要进一步的帮助,请告诉我。