xml - 使用 Xpath 和 GetElementbyID 访问 XML 数据

标签 xml powershell

我是新的 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/

相关文章:

mysql - Powershell - mySQL 查询,每隔一次运行就会出错

powershell - 需要脚本来查找服务器激活状态

xml - 使用 Go 解析 XML 文件

php - 我应该如何存储不会经常更改的文本数据?

android - RecyclerView 中项目的 layout_weight 和 layout_gravity 不起作用

c# - 了解 linq 中使用的 xml 命名空间

html - 在 Perl 中读写未知编码的 XML 文件?

powershell - 在PowerShell中将非唯一值与唯一字段并置

c# - Powershell 通用 session 并在 Exchange 远程管理 session 中导入此 session

Azure powershell - 如何拉取