2013-04-26 49 views
0

我有一個包含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

回答

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

+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

0

由安斯加爾提供的答案相關的特定名稱,長度(和其它特性)的一個特定的節點。我的研究讓我對PowerShell有了更多的瞭解,值得注意的是SelectNodes(「// * column」)。我最終使用.Net做了一個迭代,因爲我對它更加熟悉。