使用python或PowerShell从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:格

我有许多XML文件保存在如下的结构中

#$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
      操作符的更多信息,请参阅
  • 设置内容
    将(可能修改的)字符串写回
    $file
    -NoNewLine
    (PSv5+)以防止附加额外的换行符


  • 根据定义,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
    }