【发布时间】:2019-12-08 22:02:36
【问题描述】:
给定 XML,例如
<?xml version="1.0"?>
<Products>
<Product_Group id="Robot">
<Product id="RSAPRO2017">
<DefaultShortcut>Autodesk Robot Structural Analysis Professional 2017.lnk</DefaultShortcut>
<ProgramFolder>C:\Program Files\Autodesk\Autodesk Robot Structural Analysis Professional 2017</ProgramFolder>
<UserAppDataRoaming>C:\Users\$(userName)\AppData\Roaming\Autodesk\Autodesk Robot Structural Analysis Professional 2017</UserAppDataRoaming>
</Product>
</Product_Group>
</Products>
还有一个 PowerShell 变量 $node 使用 SelectSingleNode 来选择产品,有没有办法
1:只获取节点的第一行,所以<Product id="RSAPRO2017">,和
2:获取 XML 中的行号,因此在此示例中,行号为 4。
我可以用Write-Host "<$($node.name)>" 显示#1 的近似值,但这并不能提供完整的行。
这里的目标是验证一些复杂的 XML 并提供一个错误日志,其中包含允许人们快速轻松地修改他们的 XML 的详细信息。因此,例如,由于正确的节点名称是 Product 我可能有一个错误日志
Invalid node (Productt) at line 4 <Productt id="RSAPRO2017">
我可以得到整个节点的 OuterXML,但是有些节点有 40-50 行,所以没有帮助。我可以使用 RegEx 提取第一行以获取第一个 对之间的所有内容,但我想知道是否有内置的 PowerShell/XPath 方法,而不是自己滚动?而且,获取行号似乎......一般来说是不确定的。
【问题讨论】:
-
在您的
<Productt id="RSAPRO2017">示例中,结束标记是</Product>还是</Productt>?也就是说,您是要报告 无效 的 XML(例如,根据实际模式或您硬编码的模式)还是 格式不正确的 XML ?我不确定后者是否可以使用 .NET BCL 阅读器(或者,如果有的话,您不需要检测错误,因为阅读器会抛出异常)。此外,System.Xml.Linq的 explicit interface implementation 可能是一个替代方案。
标签: xml powershell