问题描述
遵循 使用 .xml 文件中的值更新 .properties 文件 我有以下问题:
Following Update .properties file with values from .xml file I have the following problems:
问题 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:
Y.properties:
a.b.c.d=Text
我的输出是:
a.b.c.d=
Text=
=
你能帮我吗,因为我真的不明白发生了什么.
Can you please help me as I really don't understand what's going on.
问题 2:示例:X.xml
my.id = \u00D6ffnen Express WebTools
和 Y.properties
and Y.properties
<PTXT ID="my.id" CONTEXT="">Öffnen <NTI>Express WebTools</NTI></PTXT>
结果:out.properties
results in: out.properties
my.id=Öffnen Express WebTools
my.id=\u00D6ffnen Express WebTools
代替
my.id=Öffnen Express WebTools
更新
- 我的所有文件都包含嵌套 NTI,没有 NTI 和嵌套 NTI 组合的文本.
我无法按照 janos 的建议加入以 = 结尾的字符串,因为我的输出类似于:
- All my files contains nested NTI, no NTI and text with nested NTI combined.
I cannot join string that ends with = as janos suggested because my output is something like:
first.id=second.id=来自第二个 id 的文本来自第一个 id= 的文本我不知道 stackoverflow 有什么问题,但它似乎没有将我的代码视为代码......
first.id=second.id=Text from second id Text from first id=I don't know what's wrong with stackoverflow but it seems that it's not seeing my code as code....
推荐答案
鉴于您的示例 XML 文件,以及此命令:
Given your example XML file, and this command:
xmlstarlet fo --dropdtd "$file" | xmlstarlet sel -t -m "/DOC/PTXT" -v $'concat(@ID, "=", ., "\n")'
我得到这个输出:
a.b.c.d=
Text
在 xmlstarlet
的 concat
中,如果我将 .
更改为 ./NTI
,我会得到输出:
In the concat
of the xmlstarlet
if I change the .
to ./NTI
, I get the output:
a.b.c.d=Text
所以我为您提供了两个选项.如果您的某些输入文件包含 NTI
而其他输入文件不包含,并且没有混合存在和不存在 NTI
的输入文件,那么你可以添加一个条件来检测文件是否包含嵌套的 NTI
,并相应地使用不同的 xmlstarlet
命令.例如:
So I see two options for you.If some of your input files contain the NTI
and other input files don't,and there are no input files with a mix of NTI
present and absent,then you could add a conditional to detect whether the file contains the nested NTI
or not, and use different xmlstarlet
command accordingly.For example:
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"
如果一个 XML 文件可能包含这两种结构,嵌套 NTI 和无嵌套 NTI,那么另一种选择是使用 $'concat(@ID, "=", ., "\n")'
,但是处理输出,将以 =
结尾的行与下一行连接起来.
If a single XML file may contain both structures,nested NTI and no nested NTI,then another option is to use $'concat(@ID, "=", ., "\n")'
,but process the output, joining lines that end with =
with the next line.
如果您需要进一步的帮助,请告诉我.
Let me know if you need further help.
这篇关于使用 .xml 文件中的值更新 .properties 文件 - 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!