在许多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'被拒绝。”

我查找了文件和文件夹的安全设置,但是我以管理员身份登录并创建了这些文件。

对此提出建议?

+0

使用Win7,我也尝试过全名前的“Resolve-Path”。 – WickedFan 2013-04-26 22:42:47

+0

好吧,以管理员身份运行powershell解决了异常调用保存问题,但似乎并不像文件正在被修改。他们现在得到保存。 – WickedFan 2013-04-26 22:57:19

您的示例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

+0

因此,我以管理员身份运行powershell ise .exe,并且正在接收使用“1”参数调用“保存”的异常:“访问路径*被拒绝”。此外,“用户”已获得完全许可。我之前有过类似的错误,并且在Admin修复它时运行它,但这次没有。 – WickedFan 2013-04-29 15:10:23

+0

当用户完全控制文件时,“拒绝访问”听起来像某人(或某事)持有该文件的打开句柄。例如,您可以使用Systinternals'['handle'](http://technet.microsoft.com/en-us/sysinternals/bb896655)实用程序来验证它。 – 2013-04-29 22:36:22

+0

谢谢Ansgar。我结束了使用.NET解决节点删除。在58个文件中删除了2000 以上的节点。另外,要注意的是,SelectNodes(“// *列”)。 – WickedFan 2013-04-30 18:30:25

由安斯加尔提供的答案相关的特定名称,长度(和其它特性)的一个特定的节点。我的研究让我对PowerShell有了更多的了解,值得注意的是SelectNodes(“// * column”)。我最终使用.Net做了一个迭代,因为我对它更加熟悉。