我有一系列XML文件,我需要添加几行文本,但附加文本的位置非常重要,否则XML文件将不再起作用。
幸运的是,新文本需要在文本<Tools>
之后插入,文本只在每个XML文件中出现一次。
如何使用Windows批处理,找到文本<Tools>
并在此之后直接插入其他文本? (为了论证,我们可以说要添加的文本是<HELLO WORLD>
)
亲切的问候
编辑:
我刚才意识到我需要用<Tools>
<Tools> <HELLO WORLD>
的所有实例
我该怎么做?
编辑2:
以下是运行良好但不带引号的vbs
有没有办法用另一个文件的文本内容替换文本
Const ForReading = 1
Const ForWriting = 2
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Text.txt", ForReading)
strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, "CH1", "*901*")
Set objFile = objFSO.OpenTextFile("C:\Text.txt", ForWriting)
objFile.WriteLine strNewText
objFile.Close
答案 0 :(得分:0)
导致问题的报价在哪里发挥作用?
有没有办法用另一个文件的文本内容替换文本?你的意思是用另一个文件中的碎片替换某些碎片吗?
下面将在源文件中找到该字符串,并使用insert输出一个新文件。
:: Hide Command and Isolate Scope with Command Extensions
@echo off
setlocal EnableExtensions DisableDelayedExpansion
:: See the following for help
rem echo /?
rem setlocal /?
rem for /?
rem type /?
rem find /?
rem del /?
:: Setup
set "xIn=Test.xml"
set "xOut=Output.xml"
set "xTerm=<Tools>"
set "xInsert=^<HELLO WORLD^>"
:: Validate
if not defined xIn goto End
if not defined xOut goto End
:: Place on Seperate Line Method
if defined xOut if exist "%xOut%" del /f /q "%xOut%" > nul
for /f "usebackq tokens=*" %%a in (`type %xIn%`) do (
echo.%%a >> %xOut%
for /f "usebackq tokens=*" %%x in (`echo."%%a" ^| find "%xTerm%"`) do (
echo.%xInsert% >> %xOut%
)
)
:: Setup
set "xOut=Output2.xml"
:: Validate
if not defined xOut goto End
:: Place on the Same Line Method
if defined xOut if exist "%xOut%" del /f /q "%xOut%" > nul
for /f "usebackq tokens=*" %%a in (`type %xIn%`) do (
for /f "usebackq tokens=*" %%x in (`echo."%%a" ^| find /v "%xTerm%"`) do (
echo.%%a >> %xOut%
)
for /f "usebackq tokens=*" %%x in (`echo."%%a" ^| find "%xTerm%"`) do (
echo.%%a %xInsert% >> %xOut%
)
)
:End
endlocal
编辑:以下是上述脚本的修改版本,它将包含搜索字词的行替换为文件内容。它应该处理报价罚款。请参阅脚本中的call命令以了解如何使用它。
:: Hide Command
@echo off
set "xResult="
call :ReplaceWith xResult "Source.xml" "<Tools>" "Input.xml" "Output.xml"
echo.%xResult%
goto End
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:ReplaceWith <xReturn> <Source File> <Search Term> <Input File> <Output File>
:: Replace a line in the source file containing the search term with the entire
:: contents of the input file and save the changes to the output file.
:::: Note: Only supports single line search terms.
:: Returns the number of lines replaced. -1 for error.
:: Hide Commands, Isolate Scope, and Set Abilities
@echo off
setlocal EnableExtensions DisableDelayedExpansion
:: Setup
set "xResult=-1"
set "xSource=%~2"
set "xTerm=%~3"
set "xInput=%~4"
set "xOut=%~5"
:: Validate
if not defined xSource goto EndReplaceWith
if not exist "%xSource%" goto EndReplaceWith
if not defined xTerm goto EndReplaceWith
if not defined xInput goto EndReplaceWith
if not exist "%xInput%" goto EndReplaceWith
set "xResult=0"
:: Search
type nul > %xOut%
for /f "usebackq tokens=* delims=" %%a in (`type "%xSource%"`) do (
for /f "usebackq tokens=*" %%x in (`echo."%%a" ^| find /v "%xTerm%"`) do (
echo.%%a>> %xOut%
)
for /f "usebackq tokens=*" %%x in (`echo."%%a" ^| find "%xTerm%"`) do (
type "%xInput%" >> %xOut%
echo.>> %xOut%
set /a "xResult+=1"
)
)
:EndReplaceWith
endlocal & if not "%~1"=="" set "%~1=%xResult%"
goto :eof
:: by David Ruhmann
:End
endlocal
答案 1 :(得分:0)
使用或构建XSLT并将其应用于保持XML有效是不是更安全?如果您愿意探索此选项,我建议您使用例如用于批处理文件的命令行xslt处理器,如AltovaXML(免费社区版) 许多IDE /代码编辑器,例如Visual Studio / Notepad ++ / Emacs / Eclipse / ...,也有办法应用甚至调试XSLT(有时集成,有时使用插件或附加组件),这在编写转换时可能很方便。