xml - 如何使用 powershell 在 XML 中打印尖括号
问题描述
我想在powershell中打印尖括号(<,>),但它分别打印到>和<。有什么办法可以打印这些符号。
我已经使用 \ 来克服括号的转义属性以及单个引号,但结果保持不变。
$xml = [xml](Get-Content -Path C:\Users\Desktop\new.xml)
$xml.Deploy.app="$<abc\bc>"
$xml.Save("C:\Users\Desktop\new.xml")
我希望输出是
<?xml version="1.0"?>
<Deploy>
<app><abc\bc></app>
</Deploy>
但它打印
<?xml version="1.0"?>
<Deploy>
<app><abc\bc></app>
</Deploy>
提前致谢!!
解决方案
XML 需要替换 5 个字符,因为它们在 XML 中具有特殊含义。这些字符在<>&'"
这里,您不能简单地在这些字符前面加上一些转义字符,如反斜杠,而是需要将它们转换为命名或编号的实体。
正如您所注意到的,这种转换会在 中自动发生[xml]
,但如果需要,也有多种方法可以手动进行:
$str = "$<abc\bc>"
1)使用字符串.Replace()
方法:
$str.Replace("&", "&").Replace("'", "'").Replace('"', """).Replace("<", "<").Replace(">", ">")
2)使用.Net System.Security:
Add-Type -AssemblyName System.Security
[System.Security.SecurityElement]::Escape($str)
3)使用 System.Xml.XmlDocument:
[xml]$doc = New-Object System.Xml.XmlDocument
$node = $doc.CreateElement("root")
$node.InnerText = $str
$node.InnerXml
4)使用正则表达式:
$str -ireplace '"|&#x(?:00)?22;|"', '"' `
-ireplace "'|&#x(?:00)?27;|'", ''' `
-ireplace '<|&#x(?:00)?3C;|<', '<' `
-ireplace '>|&#x(?:00)?3E;|>', '>' `
-ireplace '&|&#x(?:00)?26;|&(?!(?:[a-z]+|#[0-9]+|#x[0-9a-f]+);)', '&'
以上所有操作都会将 XML 特殊字符转换为实体,因此结果将如下所示:
$<abc\bc>
如果您绝对不希望将 XML 特殊字符转换为实体,那么 AFAIK 只有将值设置为CDATA 部分的选项,这会将您的字符串包装在里面<![CDATA[
和]]>
]。要在您的示例中使用它,请将行更改$xml.Deploy.app="$<abc\bc>"
为:
$xml['Deploy']['app'].AppendChild($xml.CreateCDataSection("$<abc\bc>")) | Out-Null
现在它将打印:
<?xml version="1.0"?> <Deploy> <app><![CDATA[$<abc\bc>]]></app> </Deploy>
要将此 CDATA 值作为字符串读回,您可以执行$value = $xml.Deploy.app.InnerText
或$value = $xml.Deploy.app.'#cdata-section'
希望能解释
推荐阅读
- javascript - 如何创建包含 React 组件的 TypeScript 模块
- ios - 无法使用 Alamofire 检索确切的查询响应
- elixir - 基于自定义键字段名称的 Ecto Join
- azure-devops - 无法使用 Azure DevOps + Terraform 创建 Azure AD 应用程序
- python - 从python中的字符串列表中删除字符
- c# - Selenium web 驱动程序图标状态识别
- reactjs - 从 src 以外的其他源文件夹运行测试
- javascript - Taiko 自动化测试 - 获取 DOM 元素
- android - 禁用 TextInputEditText 时禁用密码切换 ImageButton
- excel - 很长的 Teradata 查询文本出现问题