如何使用DOS .bat将带有计算值的行插入到XML文件中?

时间:2012-09-26 16:14:09

标签: windows batch-file

我需要使用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执行此操作的任何建议吗?

谢谢!

1 个答案:

答案 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_batchrestored_!line!的那些小行会杀了你。

需要替换的其中一个字符是

"

如果您正在替换该字符,识别哪些行包含您需要的数据,以及在何处插入新数据,我将提供替换重定向字符的代码并在需要时修复代码。 (请记住,替换双引号可能很棘手,但最基本的搜索和替换方法会起作用。)

完成此操作后,编辑您的问题以包含您的作品 此外,你不必完美,只需付出一些努力,我会帮助你。