XML 'name' 属性,以及带有 SelectNodes 的 XML 变量类型

标签 xml powershell xpath

我有两个关于 XML 的问题...

  1. 给定一个像这样的 XML 节点

    <Product name="Dave">
    

    并使用 SelectSingleNode 分配给变量,$xmlNode.name 将返回 Dave。但是,如果 XML 是

    <Product id="Dave">
    

    然后$xmlNode.name将返回Product。

    由于“name”可以指节点的属性,也可以指节点本身的名称,这是否反对使用 Name 作为属性,最佳实践是使用像这里这样的 ID ?或者这真的不太可能成为问题吗?如果名称更有意义,那么就用它来运行?

  2. 给定一堆 Product 节点和这样的代码

    $tempProducts = $temp.xml.SelectNodes('//Product')
    

    Write-Host "$($tempProducts.GetType())" 将建议结果变量的类型为

    System.Xml.XPathNodeList, System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

    但是,[System.Xml.XPathNodeList]$tempProducts = $temp.xml.SelectNodes('//Product') 会抛出错误,

    Unable to find type [System.Xml.XPathNodeList].

出现此问题是因为我一直在大型脚本中输入变量,并认为这可能会节省我一些调试时间。但这个条件似乎给我带来了麻烦。

有什么想法吗?

最佳答案

回复 1:

为了方便起见,PowerShell 适应 XML 元素,将其子节点及其属性显示为常规对象属性

这通常使得在 PowerShell 中使用 XML 变得非常方便,但也有其缺陷:

如果与底层 System.Xml.XmlElement 的属性存在命名冲突类型,适应的属性优先。

示例 XML 中的 Name 属性 发生了这种情况:PowerShell 将其公开为 .Name 属性 ,它隐藏XMlElement.Name属性,该属性报告标记名称

一个简单的解决方法是调用属性访问器方法.get_Name()来获取隐藏的XmlElement属性:

$node = ([xml] '<xml><Product Name="Dave" /></xml>').SelectSingleNode('//Product')

$node.Name       # adapted property: Name *attribute* -> 'Dave'
$node.get_Name() # native property: tag name -> 'Product'

也就是说,如果您控制 XML 的格式,最好从一开始就避免此类冲突。


回复2:

.SelectNodes()也许令人惊讶的是返回一个派生自记录的 System.Xml.XmlNodeList 的类型返回类型并且派生类型本身不是公共(public)的:System.Xml.XPathNodeList is internal .

这在实践中不是问题,因为重要的是它可以充当 System.Xml.XmlNodeList 实例,但可能会造成困惑。

给定类型的实例,您可以检查类型的派生(基类链),如下所示:

$nodeList = ([xml] '<xml><Product Name="Dave" /><Product Name="Jane" /></xml>').SelectNodes('//Product')

$type = $nodeList.GetType()
do {
 $type.FullName 
} while ($type = $type.BaseType)

以上产量:

System.Xml.XPathNodeList
System.Xml.XmlNodeList
System.Object

关于XML 'name' 属性,以及带有 SelectNodes 的 XML 变量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57435430/

相关文章:

c# - 将 XML 文件反序列化为 C# 类

php - 让 PHP 确认 XML 错误

powershell - 如何将文件结构保存到文本文件?

PowerShell,针对不指向文件但启动文件下载的 url 调用 WebRequest

javascript - 使用 XPATH Javascript 获取 XML 片段

xml - 删除 XML 元素的 PowerShell 脚本

xml - 如何告诉 XML 解析器忽略丢失的实体

entity-framework - 如何从 psake 构建运行代码优先迁移?

php - 将 xPath 用于 sitemap.xml

xml - XPath 3.x - 排序功能