关注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
更新
我无法加入以=结尾的字符串作为janos建议,因为我的输出类似于:
first.id = second.id =来自第二个id的文本 第一个id =的文字 我不知道stackoverflow有什么问题,但它似乎没有把我的代码视为代码....
答案 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")'
结尾的行与下一行连接起来。
如果您需要进一步的帮助,请告诉我。