删除许多XML文件中的元素

时间:2013-04-26 22:40:36

标签: xml powershell

我有一个包含40个xml文件的文件夹,我需要删除<column ..../>元素。

我想一气呵成。以下是我需要修改的文件示例:

<?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”参数调用“Save”的异常:“拒绝访问路径'C:\ xml \ ActivityChargeCalculation.hbm.xml'。”

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

建议?

2 个答案:

答案 0 :(得分:1)

您的示例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中的文件没有写入权限,则需要使用管理员权限运行脚本。

答案 1 :(得分:0)

Ansgar提供的答案与特定名称,长度(和其他属性)的特定节点相关。我的研究让我对powershell有了更多启发,值得注意的是SelectNodes(“// * column”)。我最后使用.Net做了一个itteration,因为我对它更熟悉。