0

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

谢谢!

4

1 回答 1

0

您最大的问题将是<>符号在 XML 文件中随处可见。(HTML也是)。

在批处理中,这些是重定向字符,并且会在处理包含它们的文本的每一行中导致错误,除非处理得非常小心。甚至可能在那时。

需要发生的是这些被其他东西取代。批处理转义字符^+符号,或者完全是其他东西。转义它们的问题在于,每次将该字符串暴露给批处理命令时,转义字符都会消失。

因此,假设您转义了所有重定向符号。

下次您更改该字符串时,转义字符将通过转义重定向符号来工作,但这样做它们会“用完”并从字符串中消失。这意味着下次您对该字符串执行任何操作时,它们将不存在,并且会发生错误,因为您没有将任何内容重定向到任何内容。或者什么都没有,或者....等等。

您可以通过使用双引号将字符串括起来来解决这个问题,但是使用双引号会引入它自己的一组问题,并且这些问题取决于您如何使用这些双引号。你把它们放在字符串里吗?绕弦?或者你用它们包围你的命令。每种技术都有其缺点和局限性。其中之一是您无法将其中两种技术结合起来,更不用说您了。

最后,要在文件中间实际插入一行(事实上,除了结尾之外的任何地方),您需要创建一个文件,并在到达其中的正确位置时将行添加到该文件中。这意味着您对数据行所做的所有更改都需要反转,然后重定向字符转义(因为用双引号将字符串括起来只会混淆您的 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!会害死你的。

需要替换的字符之一是

"

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

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

于 2012-09-28T04:34:42.363 回答