Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在标记前使用批处理文件在XML中添加一行_Regex_Xml_Windows_Batch File - Fatal编程技术网

Regex 在标记前使用批处理文件在XML中添加一行

Regex 在标记前使用批处理文件在XML中添加一行,regex,xml,windows,batch-file,Regex,Xml,Windows,Batch File,我有一个类型为的XML文件 .... <sometag> <tag attr_name1="long filename1" /> <tag attr_name2="long filename2" /> .... </sometag> .... 。。。。 .... .... 在之前,我想添加到目前为止,我的Windows批处理脚本中的代码是: @echo off setlocal enableDelayedExpansion set "newVa

我有一个类型为的XML文件

....
<sometag>
<tag attr_name1="long filename1" />
<tag attr_name2="long filename2" />
....
</sometag>
....
。。。。
....
....
之前,我想添加
到目前为止,我的Windows批处理脚本中的代码是:

@echo off
setlocal enableDelayedExpansion
set "newValue=^<tag attr_name="long filename" /^>
set newline=^& echo.
type "File.xml"|replace "(</tag>)" "!newValue!$1" >dupFile.xml
move /y "dupFile.xml" "File.xml"
@echo关闭
setlocal enableDelayedExpansion
设置“新值”=^
设置换行符=^&回显。
键入“File.xml”| replace“()”!新价值$1“>dupFile.xml
移动/y“dupFile.xml”“File.xml”
我得到“
路径未找到-
”,File.xml包含“未替换文件”。我知道从批处理文件编辑xml不是最佳做法,但不幸的是不能使用第三方可执行文件。有人能帮我解决哪里出了问题吗

此外,我还检查了如何使用批处理文件在XML中的标记之间更改数据,当我使用建议的代码并根据我的要求进行更改时,我得到了上述错误。

如果
在XML中只出现一次,并且如果它不会破坏层次结构,那么在前面的行中插入新的
节点,您就可以循环使用带有
for/F
循环的XML文件,检查每行是否包含
。找到后,只需在回显匹配行之前回显新的

@echo关闭
setlocal
>“newfile.xml”(
对于/f“usebackq delims=“%%I in”(“xmlfile.xml”)do(
设置“行=%%I”
延迟扩展
如果不是“!line!”==”!line:/sometag=!”(
回音^
)
端部
回声(%%I
)
)
键入“newfile.xml”
但实际上,假设您的XML是完全有效的,最优雅的解决方案是将XML解析为结构化数据,而不是复杂的文本。这样一来,无论您的代码是美化、缩小、丑陋还是其他什么,解析器都能理解它,而不管缩进和换行。您可以这样做这与Windows中已经内置的语言有关——VBScript、JScript、PowerShell、C#等等。Batch可能是您唯一熟悉的语言,但它不是Windows基本安装中唯一可用的语言。下面是一个快速而肮脏的Batch+PowerShell混合脚本来演示。(使用.bat扩展名保存它。)


[xml]$xml=gc$env:infle
$parent=$xml.documentElement.selectSingleNode(“//$env:parentNode”)
$new=$xml.createElement($env:newTag)
[void]$new.setAttribute($env:newAttr,$env:attrVal)
[void]$parent.appendChild($new)
$xml.save($env:outfile)

您不能使用php、python或perl?甚至Powershell?无论
replace
是什么,这都是第三方的,因为batch没有本机的replace命令。不幸的是,您不能使用Java、php、python、perl、Powershell,因为这是为了在客户端自动安装服务器组件。replace只是“REPL”" command@DivyaJyotiRajdev假设您错误地认为PowerShell无法“在客户端自动安装服务器组件”,无论Technobable想要传达什么。继续,直到意识到这实际上是正在发生的事情,并且您弄错了为止。Win 8到10还包括PowerShell;并且VBScript/JScript在Windows中已经包含了更长的时间。谢谢您的帮助,效果非常好,如果您能帮助调试,我将不胜感激我在尝试捕获正则表达式时哪里出了问题?与此同时,我将探索更好的PowerShell替代方案solutions@DivyaJyotiRajdev很抱歉,我没有使用
replace.exe
的经验。事实上,我以前从未听说过你的问题。