我需要使用DOS批处理文件将带有计算值的行添加到xml文件中。
这是我的意见:
<Sale>
<saleID>82</saleID>
<total currency="USD" readonly="true">63</total>
<cost currency="USD" readonly="true">38.54</cost>
</Sale>
将'利润'计算为(总成本)并生成:
<Sale>
<saleID>82</saleID>
<total currency="USD" readonly="true">63</total>
<cost currency="USD" readonly="true">38.54</cost>
<profit>24.46</profit>
</Sale>
尝试过xmlstarlet,但它没有所需的数学函数。有关如何使用.bat执行此操作的任何建议吗?
谢谢!
答案 0 :(得分:0)
您最大的问题是,<
和>
符号在XML文件中随处可见。 (也是HTML)。
在批处理中,这些是重定向字符,并且会在处理包含它们的文本的每一行中导致错误,除非非常小心地处理。可能即便如此。
需要发生的是这些被其他东西取代。批量转义字符^
+符号,或完全不同的其他内容。转义它们的问题是,每次将该字符串暴露给批处理命令时,转义字符都会消失。
所以让我们说你逃脱了所有的重定向符号。
下次更改该字符串时,转义字符将通过转义重定向符号来起作用,但这样做会使它们“用完”并从字符串中消失。这意味着下次你对该字符串执行任何时,它们将不存在,并且会发生错误,因为您将任何内容重定向到空。或者什么都没有,或......等等。
你可以通过使用带双引号的字符串来解决这个问题,但是使用双引号会引入它自己的一组问题,这些问题会因你使用这些双引号而有所不同。你把它们放在绳子里面吗?在弦周围?或者你用他们包围你的命令。每种技术都有它的缺点和局限。其中一个原因是你无法将这两种技术结合起来,更不用说你了。
最后,要实际将一行插入到文件的中间(事实上除了最后的任何地方),您需要创建一个 new 文件,并在此处添加该行你到了正确的位置。这意味着您对数据行所做的所有更改都需要反转,然后重定向字符会被转义(因为用双引号包围字符串只会混淆您的XML解析器)。简单地消除烦人的角色根本不是一种选择。
你批量的肉会像:
setlocal enabledelayedexpansion
set source=c:\whatever.xml
set dest=c:\temp.xml
for /f "tokens=*" %%x in (%source%) do (
:: One technique for dealing with redirection characters
set "line=%%x"
make_line_palitable_to_batch
if (line_contains_flag) (
do_calculation_or_manipulation
echo restored_!line!>>%dest%
)
echo restored_!line!>>%dest%
)
move /y %dest% %source%
伪代码make_line_palitable_to_batch
和restored_!line!
的那些小行会杀了你。
需要替换的其中一个字符是
"
如果您正在替换该字符,识别哪些行包含您需要的数据,以及在何处插入新数据,我将提供替换重定向字符的代码并在需要时修复代码。 (请记住,替换双引号可能很棘手,但最基本的搜索和替换方法会起作用。)
完成此操作后,编辑您的问题以包含您的作品 此外,你不必完美,只需付出一些努力,我会帮助你。