使用Powershell读取XML文件中的所有节点,并对内容进行URL编码

使用Powershell读取XML文件中的所有节点,并对内容进行URL编码,xml,powershell,Xml,Powershell,我使用powershell脚本从一个源将XML文件从网页拉入本地文件。拉取的文件保存到硬盘上,看起来很好。需要将此XML文件推送到另一个站点,但由于某些节点数据不是URL编码的,因此无法通过其XML架构验证。原始XML文件将此数据包含在CDATA标记中,但另一个站点仍未能通过验证,对它们的调用表明所有数据都需要进行URL编码。powershell中是否有方法读取XML文件的内容,URL仅对内容进行编码并将其写回?我尝试使用以下代码: Add-Type -AssemblyName System.W

我使用powershell脚本从一个源将XML文件从网页拉入本地文件。拉取的文件保存到硬盘上,看起来很好。需要将此XML文件推送到另一个站点,但由于某些节点数据不是URL编码的,因此无法通过其XML架构验证。原始XML文件将此数据包含在CDATA标记中,但另一个站点仍未能通过验证,对它们的调用表明所有数据都需要进行URL编码。powershell中是否有方法读取XML文件的内容,URL仅对内容进行编码并将其写回?我尝试使用以下代码:

Add-Type -AssemblyName System.Web
Get-ChildItem d:\temp\bvproductfeed.xml | % {
$encoded = [System.Web.HttpUtility]::UrlEncode($(get-content $_.FullName))
$encoded | Out-File $_.FullName -Force
}
但这会对整个文件进行编码。我只需要对节点中的文本进行编码,而不是整个文件

下面是我需要阅读的XML示例

    <?xml version="1.0" encoding="utf-8"?>
<Feed xmlns="https://foo.bar/xs/15.3" name="Foo Products" incremental="false" extractDate="2017-10-20T13:21:41">
    <Brands>
        <Brand>
            <ExternalId>Test</ExternalId>
            <Name>Test Name</Name>
            <Names> 
                <Name locale="en_US">Test US</Name>
                <Name locale="sp_MX">Test Mexico</Name>
            </Names>
        </Brand>
    </Brands>
    <Categories>
        <Category>
            <ExternalId>Foo</ExternalId>
            <Name>Widget</Name>
            <CategoryPageUrl><![CDATA[http://foo.com/widget></CategoryPageUrl>
            <ImageUrl>http://foo.com/imageeditor/widget.jpg</ImageUrl>
            <ParentExternalId>Bar</ParentExternalId>
        </Category>
    </Categories>
    <Products>
        <Product>
                <ExternalId>90084</ExternalId>
                <Name>Foo-bar item 1</Name>
                <Description><![CDATA[<p>Description data with HTML tags ]]></Description>
                <BrandExternalId>test</BrandExternalId>
                <CategoryExternalId>Foo</CategoryExternalId>
                <ProductPageUrl><![CDATA[http://foo.com/90084]]></ProductPageUrl>
                <ImageUrl>http://foo.com/imageeditor/90084.jpg</ImageUrl>
                <ModelNumbers>
                    <ModelNumber>90084</ModelNumber>
                </ModelNumbers>
                <ManufacturerPartNumbers>
                    <ManufacturerPartNumber>90084</ManufacturerPartNumber>
                </ManufacturerPartNumbers>
                <UPCs>
                    <UPC>081483007601</UPC>
                </UPCs>
                <Attributes>
                    <Attribute id="BV_FE_FAMILY">
                        <Value>Foo-bar</Value>
                    </Attribute>
                    <Attribute id="BV_FE_FAMILY">
                        <Value>Foo</Value>
                    </Attribute>
                    <Attribute id="BV_FE_FAMILY">
                        <Value>Bar</Value>
                    </Attribute>
                </Attributes>
            </Product>
    </Products>
</Feed>

试验
测试名称
考验我们
测试墨西哥
福
小装置
http://foo.com/imageeditor/widget.jpg
酒吧
90084
Foo bar项目1
带有HTML标记的描述数据]]>
测试
福
http://foo.com/imageeditor/90084.jpg
90084
90084
081483007601
富吧
福
酒吧
有许多品牌、类别和产品需要穿越,但每个都有这样的结构。有一些CDATA标记需要编码,但对于另一家公司,它们的要求是所有值都要进行URL编码


谢谢。

所有元素文本或属性文本或两者?还是仅仅是CDATA文本?请在问题中添加XML内容或示例。所有元素文本,而不是属性文本和CDATA您需要显示您希望从中获得的确切结果。“必须对所有内容进行编码”太模糊了。节点中的所有值都需要通过HttpUtility.UrlEncode方法运行,以便对值进行编码。因此,在标记中,我读取值,对其进行编码并将其写回标记中。要替换的最关键的值是CDATA标记。虽然CDATA的定义应该否定URLEncode的需要,但除非CDATA也是编码的,否则它会破坏它们的验证。因此,描述和ProductPageUrl是文件中最关键的编码。所有元素文本或属性文本或两者?还是仅仅是CDATA文本?请在问题中添加XML内容或示例。所有元素文本,而不是属性文本和CDATA您需要显示您希望从中获得的确切结果。“必须对所有内容进行编码”太模糊了。节点中的所有值都需要通过HttpUtility.UrlEncode方法运行,以便对值进行编码。因此,在标记中,我读取值,对其进行编码并将其写回标记中。要替换的最关键的值是CDATA标记。虽然CDATA的定义应该否定URLEncode的需要,但除非CDATA也是编码的,否则它会破坏它们的验证。因此,Description和ProductPageUrl是在文件中编码的最关键部分。