使用python或PowerShell从XML代码中删除额外字符
我有许多XML文件保存在如下的结构中使用python或PowerShell从XML代码中删除额外字符,python,xml,powershell,Python,Xml,Powershell,我有许多XML文件保存在如下的结构中 #$Dummy$#<MAIN location='Loc-01'> --- Other tags & Elements --- </MAIN> #$Dummy$# ---其他标记和元素--- 请注意开头的字符#$Dummy$#。这是故意插入的,以保护任何解析和读取数据的入侵者。除此之外,其余数据纯粹是xml。文件以.xml扩展名保存。我知道如何使用元素树解析xml 在这种情况下,元素树抛出以下错误 ParseError:格
#$Dummy$#<MAIN location='Loc-01'>
--- Other tags & Elements ---
</MAIN>
#$Dummy$#
---其他标记和元素---
请注意开头的字符#$Dummy$#
。这是故意插入的,以保护任何解析和读取数据的入侵者。除此之外,其余数据纯粹是xml。文件以.xml
扩展名保存。我知道如何使用元素树
解析xml
在这种情况下,元素树
抛出以下错误
ParseError:格式不正确(无效令牌):第1行第2列
目前,我们使用任何文本编辑器打开文件&手动删除字符。如何使用
Python
或powershell
删除此代码。因为有1000个文件需要解析。在python中,如果您的字符模式很简单,您可以使用如下的替换方法。如果不是,您可能需要导入类似regex的内容来完成任务。这还假设所有文件都在一个目录中
导入操作系统
path=“/directory”
_files=os.listdir(路径)
坏字符=[“()”,“”(“)
对于\u文件中的\u文件:
文件=打开(a,“r+”)
line=file.read
对于坏字符中的字符:
行。替换(字符)
file.write(行)
file.close()文件
在这种简单的情况下,通过正则表达式进行文本处理听起来是正确的方法,就像下面的PowerShell解决方案一样(根据定义,如果在格式良好的XML之前有多余的文本,您不能将文件解析为XML):
重要信息:使用默认字符编码,与原始输入文件的编码无关;在Windows PowerShell中,这是活动的ANSI代码页;更合理地说,它在PowerShell核心中是无BOM的UTF-8。根据需要使用-encoding
参数
返回当前文件夹中的所有Get ChildItem-Filter*.xml
文件;根据需要调整此命令;请参阅*.xml
将整个文件作为单个字符串读入内存;请参阅Get Content-Raw$file
区分大小写(-creplace
)在输入的最开始(c
)匹配文本字符串^
字符串(将正则表达式转义为$Dummy$
,因为\$Dummy\$
具有特殊含义),并隐式地将其替换为空字符串(因为没有给出替换操作数),这将有效地删除它$
- 有关PowerShell的
操作符的更多信息,请参阅-replace
- 有关PowerShell的
将(可能修改的)字符串写回设置内容
$file
(PSv5+)以防止附加额外的换行符-NoNewLine
根据定义,XML文件格式良好。如果这些字符驻留在这样的节点之外,那不是XML文件。请考虑检查这些材料是如何生成的,希望使用兼容的DOM库。@ MKLMunt()此代码仅在
\$Dummy$\\$\/code>字符位于开头时有效。但是,如果它位于结尾,则不起作用。在这种情况下如何修改?@Tommy:use-creplace'\$Dummy\$\\\\\$$\/code>@Tommy:很高兴听到此消息;很好的一点是额外换行:您需要使用Set Content-NoNewLine
来防止出现这种情况(仅适用于PowerShell v5+)-我已经更新了答案。
Get-ChildItem -Filter *.xml | ForEach-Object {
$file = $_.FullName
(Get-Content -Raw $file) -creplace '^#\$Dummy\$#' | Set-Content -NoNewLine $file
}