我是新的 powershell,不太擅长。如果我用词错误,请耐心等待。
假设我的.Xml
文件的内容是:
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
]>
<svg version="1.1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 500 500"
style="enable-background:new 0 0 500 500;" xml:space="preserve">
<switch>
<foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
<i:aipgfRef xlink:href="#adobe_illustrator_pgf">
</i:aipgfRef>
</foreignObject>
<g i:extraneous="self">
<g id="Background">
<rect style="fill:#FFFFFF;stroke:#000000;stroke-miterlimit:10;" width="500" height="500"/>
</g>
<g id="Guides" style="display:none;">
<rect y="400.25" style="display:inline;fill:none;" width="500" height="149.75"/>
</g>
<g id="Card_Symbl">
<g id="Layer_10">
<polygon style="fill:#E30613;" points="436.87,87.48 31.42,175.37 192.19,246.84 214.13,403.67 "/>
</g>
</g>
<g id="Card_Modifier">
<rect y="424" style="fill:#009FE3;" width="500" height="76"/>
</g>
<g id="Card_Short_Name">
<text transform="matrix(1 0 0 1 32.4003 480.7129)" style="fill:#FFFFFF; font-family:'MyriadPro-Regular'; font-size:70px;">Hello, World</text>
</g>
<g id="Card_HUD">
<g id="Bottom_Right">
<rect x="408" y="348" width="92" height="76"/>
<text transform="matrix(1 0 0 1 420.9258 411)" style="fill:#FFED00; font-family:'MyriadPro-Regular'; font-size:75px;">-</text>
</g>
<g id="Bottom_Left_00000030455522749116218520000014918866582792132275_">
<rect y="348" width="88" height="76"/>
<text transform="matrix(1 0 0 1 5 411)" style="fill:#FFED00; font-family:'MyriadPro-Regular'; font-size:75px;">1</text>
</g>
<g id="Top_Right">
<rect x="408" width="92" height="76"/>
<text transform="matrix(1 0 0 1 421 60)" style="fill:#FFED00; font-family:'MyriadPro-Regular'; font-size:75px;">-</text>
</g>
<g id="Top_Left">
<rect style="fill:#008D36;" width="92" height="76"/>
<text transform="matrix(1 0 0 1 12 60)" style="fill:#FFED00; font-family:'MyriadPro-Regular'; font-size:75px;">-</text>
</g>
</g>
</g>
</switch>
</svg>
文件的导入方式如下:
$xmlSample = Get-Content -Raw -Path ".\FlashCard V4.svg"
$XML = [xml]$xmlSample
我正在尝试浏览它的结构。我尝试过:
$xml.GetElementById(Card_Symbl)
Powershell 不返回任何内容。然后我尝试了:
$var = Select-Xml -Xml $XML -XPath "/svg/switch"
同样,Powershell 没有返回任何内容。
我设法解决了这个问题:
$xml.svg.Switch.g.g.g
它按预期工作,Powershell 返回该“级别”的所有数据,但我认为这不是那么通用。在中型到大型数据集中,这将是令人畏惧的。
阅读我正在学习的文档和这本书,我非常喜欢 Select-Xml -Xml $XML -XPath "/svg/switch"
方法。它使事情变得像在文件资源管理器中导航目录或文件夹一样简单。
如果我可以问,我可以看一个工作示例吗:
$xml.GetElementById(Card_Symbl)
还有一个工作示例:
$var = Select-Xml -Xml $XML -XPath "/svg/switch"
这两种情况都使用我上面的 xml 示例,并将返回一些目标数据。
只要是在 Powershell 中,我就愿意接受建议。
最佳答案
该文档有一个默认的命名空间,因此您必须对节点引用进行命名空间限定,例如
Select-Xml -Xml $XML -XPath "/s:svg/s:switch" -Namespace @{s = "http://www.w3.org/2000/svg"}
要检索“Hello, World”,您可以使用如下 XPath:
$e = Select-Xml -Xml $XML -XPath '/s:svg/s:switch/s:g/s:g[@id="Card_Short_Name"]/s:text/text()' -Namespace @{s = "http://www.w3.org/2000/svg"}
$e.Node.Value
关键是这个表达式
s:g[@id="Card_Short_Name"]
它会查找 id 属性为“Card_Short_Name”的 s:g
元素。
另外需要注意的是,XmlElement 没有 .Value,您必须使用 s:text/text()
抓取元素下的文本节点来提取值。
关于xml - 使用 Xpath 和 GetElementbyID 访问 XML 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73514145/