在许多XML文件中删除元素
我有一个包含40个xml文件的文件夹,我需要删除<column ..../>
元素。在许多XML文件中删除元素
我想一口气做到这一切。这是我需要修改过的文件的一个例子:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<!-- generated using CMHInc.NHibernate.hbm.cst -->
<class name="CMHInc.Lodge.Business.Core.ProductType, CMHInc.Lodge.Business.Core" table="ProductType" lazy="false" schema="CMHPos">
<id name="Id" type="Guid" unsaved-value="{00000000-0000-0000-0000-000000000000}" >
<column name="Id" sql-type="uniqueidentifier" not-null="true" unique="true" index="PK_ProductType"/>
<generator class="guid.comb" />
</id>
<version name="RowId" column="RowId" generated="always" type="Byte[]"
unsaved-value="null" access="field.camelcase-underscore"/>
<property name="Type" type="String" access="field.camelcase-underscore" >
<column name="Type" length="20" sql-type="varchar" not-null="true"/>
</property>
我想删除的
<column name="Type" length="20" sql-type="varchar" not-null="true"/>
这里的每一个实例是我的PowerShell代码:
Get-ChildItem c:\xml\*.xml | % {
$xml = [xml](Get-Content $_.FullName)
$xml.catalog.book |
where { $_.title -eq "property" } |
foreach { $_.RemoveAttribute("column") }
$xml.Save($_.FullName)
}
我有以下错误:
异常调用 “保存” 与 “1”参数:“访问路径'C:\ xml \ ActivityChargeCalculation.hbm.xml'被拒绝。”
我查找了文件和文件夹的安全设置,但是我以管理员身份登录并创建了这些文件。
对此提出建议?
您的示例XML不完整,与您的代码不匹配。此外,你想删除节点,而不是属性。试试这个:
Get-ChildItem C:\xml\*.xml | ForEach-Object {
$xml = [xml](Get-Content $_.FullName)
$xml.SelectNodes("//property/column") | Where-Object {
$_.name -eq "Type" -and
$_.length -eq "20" -and
$_."sql-type" -eq "varchar" -and
$_."not-null" -eq "true"
} | ForEach-Object {
$_.ParentNode.RemoveChildNode($_)
}
$xml.Save($_.FullName)
}
请注意,你需要运行与管理权限的脚本,如果普通用户没有写权限的文件C:\xml
。
因此,我以管理员身份运行powershell ise .exe,并且正在接收使用“1”参数调用“保存”的异常:“访问路径*被拒绝”。此外,“用户”已获得完全许可。我之前有过类似的错误,并且在Admin修复它时运行它,但这次没有。 – WickedFan 2013-04-29 15:10:23
当用户完全控制文件时,“拒绝访问”听起来像某人(或某事)持有该文件的打开句柄。例如,您可以使用Systinternals'['handle'](http://technet.microsoft.com/en-us/sysinternals/bb896655)实用程序来验证它。 – 2013-04-29 22:36:22
谢谢Ansgar。我结束了使用.NET解决节点删除。在58个文件中删除了2000
由安斯加尔提供的答案相关的特定名称,长度(和其它特性)的一个特定的节点。我的研究让我对PowerShell有了更多的了解,值得注意的是SelectNodes(“// * column”)。我最终使用.Net做了一个迭代,因为我对它更加熟悉。
使用Win7,我也尝试过全名前的“Resolve-Path”。 – WickedFan 2013-04-26 22:42:47
好吧,以管理员身份运行powershell解决了异常调用保存问题,但似乎并不像文件正在被修改。他们现在得到保存。 – WickedFan 2013-04-26 22:57:19