0

我有一个需要查找、乘以(例如乘以 1.25)并替换所有价格的 xml 文件。

价格标签看起来像这样: <price><![CDATA[15.9]]></price>

操作后价格标签应如下所示: <price><![CDATA[19.875]]></price>

这可以使用正则表达式在 Notepad++ 或 PowerGrep 中完成吗?

提前致谢。

4

2 回答 2

0

据我所知,您不能使用任何一个程序来执行数学运算,但您可以使用您选择的大多数语言构建一个简单的程序来获取文件,使用正则表达式来查找数字。将该字符串作为双精度数进行数学运算并将其放回字符串中。今天晚些时候,我可能会用 c# 构建一些东西,但在大多数语言中它应该是相对简单的。如果您不在 Windows 环境中,您甚至可以构建一个 shell 脚本并使用 grep,或者在 Windows 上使用 Powershell,但我对 Powershell 的经验较少。

编辑:有一种更简单的方法可以做到这一点http://msdn.microsoft.com/en-us/library/hcebdtae(v=vs.110).aspx 这基本上是您想要使用 xmldocument 对象执行的操作。

Edit2:即使我无法获得原始海报,我也这样做了,我认为有人可能能够使用这些信息,我学到了很多东西。如果有人感兴趣,我可以将源代码添加到 github。

public static void ChangePricesWork(string filepath, double multiply)
{
  var document = new XmlDocument();
  document.Load(filepath);
  XmlNodeList nodeList = document.GetElementsByTagName("price");

  foreach (XmlNode node in nodeList)
  {
      if (!string.IsNullOrEmpty(node.InnerText))
      {
         node.InnerText = Convert.ToString(multiplyPrice(multiply, node.InnerText));
      }

   }

   string newFilePath = string.Format(@"{0}\{1}_updated.xml", Path.GetDirectoryName(filepath),   Path.GetFileNameWithoutExtension(filepath)); 
   document.Save(newFilePath);
}

   private static double multiplyPrice(double multiply, string oldPrice)
   {
     var newPrice = new double();
     if (Double.TryParse(oldPrice, out newPrice))
     {
       newPrice = newPrice * multiply;
     }
     return newPrice;
   }
于 2014-09-10T13:09:50.637 回答
0

Notepad++ 有一个Pythonscript插件,允许您创建可以访问您的文档和 Notepad++ 本身的快速 Python 脚本。

此答案中描述了安装和设置。

从那时起,API 发生了一些变化,您现在用Editor.rereplace进行正则表达式替换。

# Start a sequence of actions that is undone and redone as a unit. May be nested.
editor.beginUndoAction()

# multiply_price_cdata
from decimal import *
TWOPLACES = Decimal(10) ** -2 

def multiply_price_cdata( m ):
    price = Decimal( m.group(2) ) * Decimal( 1.25 )
    return  m.group(1) + str(price.quantize(TWOPLACES)) + m.group(3)

def cdata( m ):
    return "CDATA"

# npp++ search/replace
re_price = r'(<price><!\[CDATA\[)(\d+\.\d+|\d+)(\]\]></price>)'
editor.rereplace( re_price , multiply_price_cdata )

# end the undo sequence
editor.endUndoAction()
于 2014-09-12T18:45:19.243 回答