我正在将一些基于函数的XML读取器代码重构为类方法,并看到一些问题。使用该功能,我可以运行测试并验证XML是否正确加载,然后更改XML并测试错误情况。但是这种基于类的方法由于“在另一个程序中打开了文件”而失败,这迫使我在修改XML之前关闭控制台。
最初,我直接在xmlReader中使用路径。所以我移到了XMLReader的StreamReader输入中。我什至玩了一个全新的xmlDocument并将导入的XML的根节点导入该新的xmlDocument中。没有办法。
我怀疑基于函数的版本起作用的原因是因为xmlReader变量是本地作用域,所以当函数完成时它超出了作用域。但是我在那儿抓稻草。我还读到垃圾收集可能是一个问题,因此我在“处置”之后立即添加了[system.gc]::Collect()
,但仍然没有变化。
class ImportXML {
# Properties
[int]$status = 0
[xml.xmlDocument]$xml = ([xml.xmlDocument]::New())
[collections.arrayList]$message = ([collections.arrayList]::New())
# Methods
[xml.xmlDocument] ImportFile([string]$path) {
$importError = $false
$importFile = ([xml.xmlDocument]::New())
$xmlReaderSettings = [xml.xmlReaderSettings]::New()
$xmlReaderSettings.ignoreComments = $true
$xmlReaderSettings.closeInput = $true
$xmlReaderSettings.prohibitDtd = $false
try {
$streamReader = [io.streamReader]::New($path)
$xmlreader = [xml.xmlreader]::Create($streamReader,$xmlReaderSettings)
[void]$importFile.Load($xmlreader)
$xmlreader.Dispose
$streamReader.Dispose
} catch {
$exceptionName = $_.exception.GetType().name
$exceptionmessage = $_.exception.message
switch ($exceptionName) {
Default {
[void]$this.message.Add("E_$($exceptionName): $exceptionmessage")
$importError = $true
}
}
}
if ($importError) {
$importFile = $null
}
return $importFile
}
}
class SettingsXML : ImportXML {
# Constructor
SettingsXML([string]$path){
if ($this.xml = $this.ImportFile($path)) {
Write-Host "$path!"
} else {
Write-Host "$($this.message)"
}
}
}
$settingsPath = '\\Mac\iCloud Drive\Px Tools\Dev 4.0\Settings.xml'
$settings = [SettingsXML]::New($settingsPath)
编辑: 我也尝试了FileRead而不是StreamReader,并使用ReadWrite的FileShare,就像这样
$fileMode = [System.IO.FileMode]::Open
$fileaccess = [System.IO.Fileaccess]::Read
$fileShare = [System.IO.FileShare]::ReadWrite
$fileStream = New-Object -TypeName System.IO.FileStream $path,$fileMode,$fileaccess,$fileShare
仍然没有运气。