xml - XML“识别”标签
问题描述
我有一个 XML 文件,其中根元素有一个嵌套标签来标识节点。如何通过根元素中包含的特定标签来获取节点?
下面我有一个名为“master”的标签,它可以包含“旧”或“新”值。我怎么能抓住“新”?
示例文件:
<xml>
<foo>
<master>New</master>
<data>
<val1>Value</val1>
</data>
</foo>
<foo>
<master>Old</master>
<data>
<val1>Value</val1>
</data>
</foo>
</xml>
Select-XML 不起作用,因为有时文件具有未关闭的标签。
使用此代码,我可以从两个节点获取 val1
[xml] $xml = Get-Content "$file"
$xml.xml.foo.data
我试过了
$xml.xml.foo.data.val1 | Where-Object ($xml.xml.foo.master -eq "New")
我试过了
if ($xml.xml.foo.master -eq "New") {$xml.xml.foo.data.val1}
对不起,如果我的 xml 术语没有意义。
解决方案
需要明确的是:如果输入 XML 格式不正确(语法上有效的 XML),则任何XML 解析解决方案都不会起作用 - 无论是通过强制转换[xml]
还是通过Select-Xml
.
如果您的 XML 格式正确:
通过[xml]
和PowerShell 对 XML DOM 的改编:
$xml.xml.foo.Where({ $_.master -eq 'New' }, 'First')
如果要查找具有文本内容的多个 master
元素New
,请删除该'First'
参数。
通过Select-Xml
(通过管道Select-Object -First 1
限制到一个匹配项),如果 XML 也是有效的(格式正确并符合引用的模式 - 对示例 XML 不适用):
(Select-Xml -XPath '/xml/foo[master="New"]' -LiteralPath file.xml).Node
至于使用Get-Content
强制[xml]
转换来解析 XML 文件:
使用
-Raw
withGet-Content
可以加快速度。当心可能误读XML 文件 - 请参阅此答案的底部。
推荐阅读
- python - 用于匹配特定后缀域的 url 正则表达式
- azure - 如何在 Azure SQL 数据库上配置邮件
- java - Jhipster:应该为用户文件设置什么路径
- sharepoint - 共享策略
- mysql - mysql:查询组合来自 2 个表的信息
- reactjs - TypeScript:如何在 React 的 props 中传递组件时定义类型?
- c++ - 如何编译包括 Google Cloud Storage 库的 C++ 代码?
- scala - 如何使用Try在scala中出现异常后执行代码
- performance - 在 setter - getter 中同步类属性是否会影响线程安全性?
- c# - 如何将 NonNullable 引用属性标记为安全?