使用PowerShell的Select-Xml读取KML文件无结果,原因何在?
解决PowerShell读取KML文件时Select-Xml无返回结果的问题
你的代码有两个关键错误导致没有返回结果,我来帮你逐一排查并修正:
1. 命名空间定义错误
你在定义$XmlNamespace时,给URL额外加了一层双引号,这会导致PowerShell无法正确识别命名空间:
# 错误写法 $XmlNamespace = @{ default = '"http://www.opengis.net/kml/2.2"'; };
正确的写法应该去掉URL外层的双引号:
$XmlNamespace = @{ default = "http://www.opengis.net/kml/2.2" };
2. XPath未使用命名空间前缀
你的KML文件使用了默认命名空间(xmlns="http://www.opengis.net/kml/2.2"),在XPath查询中,所有属于这个命名空间的元素都需要通过你定义的前缀(这里是default)来引用,否则XPath会认为你要找的是没有命名空间的元素,自然匹配不到结果。
你的原XPath:
$xpath = "kml/Document/Placemark/Point"
修正后的XPath(加上命名空间前缀):
$xpath = "default:kml/default:Document/default:Placemark/default:Point"
修正后的完整代码
把这两处修改后,完整的代码应该是这样的:
$Path = "D:\temp\test\4.kml" $xpath = "default:kml/default:Document/default:Placemark/default:Point" $XmlNamespace = @{ default = "http://www.opengis.net/kml/2.2" }; Select-Xml -Path $Path -XPath $Xpath -Namespace $XmlNamespace | Select-Object -ExpandProperty Node
执行这段代码后,就能正确返回所有<Point>节点了。
补充说明
XML的默认命名空间容易让人混淆,它不像带前缀的命名空间那么直观——但只要记住:当XML声明了默认命名空间时,所有未显式指定其他命名空间的元素都属于这个默认命名空间,XPath查询必须通过前缀绑定来访问这些元素,否则会匹配失败。
内容的提问来源于stack exchange,提问作者Илья Ненашев
相关产品推荐
相关产品推荐

