解析XML,并仅查找和替换名称与regexp匹配的节点中的值(在XML中的任何深度)

解析XML,并仅查找和替换名称与regexp匹配的节点中的值(在XML中的任何深度),xml,regex,perl,xml-parsing,replace,Xml,Regex,Perl,Xml Parsing,Replace,我需要找到特定的名称(即,与几个regexp匹配的几个名称),并为每个名称隐藏其对应的值,无论它们出现在xml中的何处 通过使用XML解析库(Twig?libXML?other?) regexp部分不是用于解析,而是用于选择需要编辑的节点(即,我需要使用支持XML的库进行解析,但仅用于替换名称与特定复杂regexp匹配的节点中的值) 对于没有提供代码尝试深表歉意:(尽管我尝试了一些答案(例如:,还有很多其他答案),但我对Perl来说太陌生了,没有想到什么东西可以1)在文件的任何深度浏览,2)查找

我需要找到特定的名称(即,与几个regexp匹配的几个名称),并为每个名称隐藏其对应的值,无论它们出现在xml中的何处 通过使用XML解析库(Twig?libXML?other?)
regexp部分不是用于解析,而是用于选择需要编辑的节点(即,我需要使用支持XML的库进行解析,但仅用于替换名称与特定复杂regexp匹配的节点中的值)

对于没有提供代码尝试深表歉意:(尽管我尝试了一些答案(例如:,还有很多其他答案),但我对Perl来说太陌生了,没有想到什么东西可以1)在文件的任何深度浏览,2)查找与regexp匹配的名称。发布我微薄的尝试只会“缩小”讨论的方向(即,我真的想避免XY问题:如果我展示了我现有的尝试,并且这些尝试都得到了纠正,下面的要求将不匹配,因为我的尝试既没有“任何深度”,也没有“与regexp完全匹配的名称…”

**如果您需要(我完全理解…)示例代码,请不要进一步阅读。**(或者只是一点,看看我为什么不提供任何信息)
但是,如果您能阅读下面的3个XML示例,以及以下4点,说明我需要对它们做什么(或者更好,在“what I need:”行之后的所有内容),并为我提供一个“模板”脚本(即,一些perl,如果可能的话,使用twig或libXML),我将永远欠您的债。^
[我确实花了很多时间在各种se网站上为许多人提供帮助……我经常希望他们发布示例代码。所以我理解为什么很多人会对此投反对票,或者只是不回答,或者感到沮丧。但我无法在这里生成一个示例代码而不“扭曲”我需要的东西太多,造成了一个问题,因此我更喜欢发布我需要的东西,而不是我尝试过的东西……]

我需要什么

我有许多不同结构的xml文件

在下面的例子中:“someNames”可以是几个不同的字符串,其中我只需要找到与(复杂)regexp匹配的字符串。
一旦我找到一个(或多个)匹配项,“someValue”将是关联的值,我想用一个通用字符串替换它

XML非常简单,但仍有几种不同的结构:

例如,有时XML可能包含

...
   <sometag  name=someName  value=someValue>  
...
。。。
...
(someName或someValue可以在引号内,也可以不在引号内)

。。。
一些价值
...
甚至是另一种形式:

... 
   <someothertag   someName=someValue>
...
。。。
...
  • 当someValue位于“=”之后时,它可以带引号,也可以不带引号,具体取决于xml
  • someName也可以在引号内,当它写为
    name=someName
  • 每个文件中的someName都会更改,但我希望找到一些与特定复杂regexp匹配的文件(例如:
    /\(abc\)|\([^xyz]*def\)|..../
    ,即regexp可能非常复杂)

  • 对于那些与regexp匹配的“someName”,并且如果它们匹配,则仅匹配,我想通过一个通用字符串(例如“hidden”)更改相应的“someValue”。(某些值本身可以在每个文件中更改。但是无论它是什么(即,可以匹配“*”),我想用新值“隐藏”替换它)

标记的深度也可能因文件而异(因此我需要一个通用的解析)

很抱歉,我找不到如何做到这一点,因为我在这里找到的每个示例都是针对特定标记或特定结构的,从中我无法掌握如何使用
twig
libXML
来实现更通用的方法。。。(我对Perl非常陌生!)

我很难找到如何放置regexp,甚至无法找到如何解析多个XML并在每个XML的任何级别上查找名称

欢迎任何关于如何做到这一点的提示


更新:我正在努力想出一个合理的第一次尝试。。。但我认为,当我提出一个问题时,我可以删除这个问题。现在我正试着摸索:但这不是我需要的。我需要将该示例修改为1)允许打开任何文件(而不是像该答案中那样直接提供XML)2)我需要使用“findnodes”查找任何标记,其名称(标记名,而不是其对应的)匹配regexp(而不是某个固定的“字符串”)3)找到这些标记名后,我需要编辑相应的值以将其更改为“隐藏”。

在XML::LibXML::XPathContext的文档中有一个示例:

函数
perlmatch
允许您查找如下节点:

<someName>someValue</someName>
这将获取一个值,并根据节点的名称计算给定的正则表达式。通过一些修改,您可以与
name
属性的值进行匹配,或者在属性列表中搜索匹配项。我将把它作为练习留给读者,但以下方法应该可以让您开始:

$node->attributes();

您应该发布您的尝试,以获得关于您做错了什么的帮助。@TLP:您是对的,我通常是对的,但在这里,这只会表明我对Perl非常陌生,甚至没有解析文件…:/我试图使用现有的答案来做这件事,但我最终没有解析“无处不在”,而是在特定深度的特定命名的someName中。这就是我的问题。阅读是件好事。正则表达式和XML将以眼泪告终。XSLT不是一个更好的选择吗?@OlivierDulac:只需发布您所拥有的,即使它是坏的和错误的-这应该会打开一些好答案的闸门。这里的人们往往会不遗余力地向你展示一些关于应该如何做或可以如何做的妙招。非常感谢!这和我想知道的一模一样。我会根据你的指示起草一份脚本,然后
<someName>someValue</someName>
$nodelist->push($node) if $node->nodeName =~ $_[1];
$node->attributes();