Как читать XML, содержащий символьные сущности, с помощью XmlUrlResolver с помощью Powershell

Использование следующей строки Powershell работает правильно, пока не попадет в XML-файл, содержащий символьные сущности:

$xml = [xml] (Get-Content $file.Name)

Как вы читаете XML-файлы с помощью Powershell и позволяете ему разрешать сущности символов из DTD вместо того, чтобы генерировать такие ошибки:

Cannot convert value "System.Object[]" to type "System.Xml.XmlDocument". Error: "Reference to undeclared entity 'nbsp'. Line 3, position 324."
Cannot convert value "System.Object[]" to type "System.Xml.XmlDocument". Error: "Reference to undeclared entity 'Oacute'. Line 3, position 239."

Чтение XML-файлов легко, если они допустимы и не содержат символов. У меня есть DTD, указанный в файле XML с этими объектами символов, но он его не использует. Пример начала XML-файла:

<?xml version="1.0"?>
<!DOCTYPE catalog SYSTEM "manual.dtd">
<catalog ...

Как включить преобразователь XML в Powershell? Файл DTD находится в той же папке, что и файлы XML.

У меня есть код для обхода этой проблемы на C#, но как мне сделать следующее с помощью Powershell?

XML = XMLString;
var dtdPath = HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data") + "\\Manual.dtd";
XML = XML.Replace("manual.dtd", dtdPath);
XmlUrlResolver resolver = new XmlUrlResolver();
resolver.Credentials = System.Net.CredentialCache.DefaultCredentials;
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Parse;
settings.ValidationType = ValidationType.None;
settings.XmlResolver = resolver;
XmlReader reader = XmlReader.Create(new System.IO.MemoryStream(System.Text.UTF8Encoding.UTF8.GetBytes(XML)), settings);
var XMLPrimary = XDocument.Load(reader);

Вот мое лучшее предположение о коде Powershell для этого, но он все еще не работает. Как вы устанавливаете XmlUrlResolver с помощью Powershell?

$resolver = New-Object -TypeName System.Xml.XmlUrlResolver
$resolver.Credentials = [System.Net.CredentialCache]::DefaultCredentials
$readerSettings = New-Object -TypeName System.Xml.XmlReaderSettings
$readerSettings.DtdProcessing = [System.Xml.DtdProcessing]::Parse
$readerSettings.ValidationType = [System.Xml.ValidationType]::DTD
$readerSettings.XmlResolver = $resolver
$readerSettings.MaxCharactersFromEntities = 2048;
$readerSettings.ValidationFlags = [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessInlineSchema -bor [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessSchemaLocation
$readerSettings.add_ValidationEventHandler(
{
    Write-Host $("`nError found in XML: " + $_.Message + "`n") -ForegroundColor Red
    $script:errorCount++
});
$reader = [System.Xml.XmlReader]::Create($XmlFile.FullName, $readerSettings)
while ($reader.Read()) { }
$reader.Close()

person Jeremy Odekirk    schedule 25.02.2015    source источник
comment
Это не дубликат. Как загрузить внешний DTD XML, чтобы он мог найти объекты символов с помощью Powershell? Как преобразовать этот пример в Powershell? msdn.microsoft.com /en-us/библиотека/   -  person Jeremy Odekirk    schedule 26.02.2015
comment
Я обнаружил, что XmlUrlResolver не нужно устанавливать... или он устанавливается автоматически, если вы загружаете XML по-другому. Используя $xml = новый объект Xml.XmlDocument; $xml.Загрузить($путь); Работает, тогда как загрузка XML с этим не работает, когда существуют символьные сущности: $xml = [xml] (Get-Content $file.Name)   -  person Jeremy Odekirk    schedule 27.02.2015