【发布时间】:2017-10-20 12:48:27
【问题描述】:
我有一堆 XML 文件,我需要在节点文本中执行一些替换操作。我的代码似乎无法更新 <Notes> 节点,因为它找不到。我检查了 Notepad++ 中的 XML 路径,它看起来是正确的。
这是我用来测试的示例 XML 文件。
<?xml version="1.0" encoding="UTF-8"?>
<OrganisationUnits>
<OrganisationUnitsRow num="21">
<OrganisationId>ORG1</OrganisationId>
<OrganisationName>ORG 1 TEST</OrganisationName>
<Addresses>
<AddressesRow num="1">
<AddressId>E41002</AddressId>
<MainAddress>Y</MainAddress>
</AddressesRow>
</Addresses>
<ContactDetails>
<ContactDetailsRow num="1">
<ContactId>E6366</ContactId>
<ContactCode>OFFICE</ContactCode>
<Main>N</Main>
<Notes>start date 11/03/1994</Notes>
</ContactDetailsRow>
<ContactDetailsRow num="2">
<ContactId>E6367</ContactId>
<ContactCode>WORK</ContactCode>
<Main>N</Main>
<Notes>start date 11/03/1995</Notes>
</ContactDetailsRow>
<ContactDetailsRow num="3">
<ContactId>E6368</ContactId>
<ContactCode>HOME</ContactCode>
<Main>Y</Main>
<Notes>start date - after 11/03/1995</Notes>
</ContactDetailsRow>
<ContactDetailsRow num="4">
<ContactId>E6369</ContactId>
<ContactCode>EMAIL</ContactCode>
<ContactCodeDesc>Email Address</ContactCodeDesc>
<ContactValue>info@yahoo.com</ContactValue>
<StartDate>2000-03-11</StartDate>
<Main>N</Main>
<Notes>more test notes</Notes>
</ContactDetailsRow>
</ContactDetails>
<Sector>P</Sector>
<SectorDesc>Private</SectorDesc>
</OrganisationUnitsRow>
</OrganisationUnits>
这是我的脚本。
#----- get source xml file(e) from the folder below ---#
$path = "C:\Dump\TEST"
$Files = Get-Childitem -path $path -File -include test_file_1.xml -name
# For every file in the folder specified perform a series of actions below
foreach ($File in $Files)
{
Write-Host "=== FILE is $File ===" -ForegroundColor "White"
$xml = [xml](Get-Content $path\$File)
## SectorDesc
# check to ensure that we have got a SectorDesc row
foreach ($OrganisationUnitsRow in $xml.OrganisationUnits.OrganisationUnitsRow)
{
if ($OrganisationUnitsRow.Item('SectorDesc'))
{
$xml.OrganisationUnits.OrganisationUnitsRow.SectorDesc = $xml.OrganisationUnits.OrganisationUnitsRow.SectorDesc.Replace("`b" , "\b") #backspace
$xml.OrganisationUnits.OrganisationUnitsRow.SectorDesc = $xml.OrganisationUnits.OrganisationUnitsRow.SectorDesc.Replace("`f" , "\f") #form feed
}
}
## Notes
# check to ensure that we have got a Notes row
foreach ($ContactDetailsRow in $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow)
{
if ($ContactDetailsRow.Item('Notes'))
{
Write-Host "$ContactDetailsRow.Notes"
$xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow.Notes = $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow.Notes.Replace("\" , "\\") #back slash
$xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow.Notes = $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetailsRow.Notes.Replace("`b" , "\b") #backspace
}
}
$xml.Save("$path\$File")
}
脚本运行时会抛出错误。
在此对象上找不到属性“注释”;确保它存在并且是 可设置。 在 C:\Dump\test10.ps1:33 char:8 + $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetails ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException +fullyQualifiedErrorId:PropertyAssignmentException 在此对象上找不到属性“注释”;确保它存在并且是 可设置。 在 C:\Dump\test10.ps1:34 char:8 + $xml.OrganisationUnits.OrganisationUnitsRow.ContactDetails.ContactDetails ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException +fullyQualifiedErrorId:PropertyAssignmentException我可能很明显,但我不能马上看到。
【问题讨论】:
标签: xml powershell replace