使用Powershell读取XML文件中的所有节点,并对内容进行URL编码
我使用powershell脚本从一个源将XML文件从网页拉入本地文件。拉取的文件保存到硬盘上,看起来很好。需要将此XML文件推送到另一个站点,但由于某些节点数据不是URL编码的,因此无法通过其XML架构验证。原始XML文件将此数据包含在CDATA标记中,但另一个站点仍未能通过验证,对它们的调用表明所有数据都需要进行URL编码。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
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是在文件中编码的最关键部分。