Разбивка XML-документа на две части с использованием внешней сущности
Я хочу разбить xml-документ на два. Это происходит в основном путем доступа ко второму xml-файлу как к внешней сущности. Первоначально полный текст документа выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body> <par1>Don't forget me this weekend!</par1> </body> </note>
этот документ сохраняется с именем файла
mymessage.txtи я могу получить доступ к содержимому тега par1 из powershell как
$xmlFileName = 'E:\mymessage.txt' [xml]$xmlDoc = Get-Content $xmlFileName Write-Host $xmlDoc.note.body.par1
Это прекрасно работает.
Что я уже пробовал:
Теперь я хочу разделить файл на две части и поместить часть тела в отдельный файл под названием
mymessage_body.txtи это выглядит так
<?xml version="1.0" encoding="UTF-8"?> <DOCTYPE body [ <!ELEMENT body (par1)> <!ELEMENT par1 (#PCDATA)> ]> <body> <par1>Don't forget me this weekend!</par1> </body>
Аналогично я помещаю заголовочную часть в другой файл (называемый
mymessage_header.txt) и это выглядит
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note [ <!ELEMENT note ANY> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ENTITY body SYSTEM "mymessage_body.txt"> ]> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> &body; </note>
Теперь я попытался получить доступ к содержимому par1 из powershell, как показано выше, он ничего не возвращает. Я хочу знать, правильно ли загружена внешняя сущность или нет. Не могли бы Вы направить свое предложение по разрешению этой проблемы? Спасибо!
0x01AA
Когда я уменьшаю mymessage_body.txt чтобы "<par1>Не забывай меня в эти выходные!</par1>", тогда это работает для меня.
getrelax
Я уменьшил содержание mymessage_body.txt к тому, что вы предложили, и я использовал команду powershell
$xmlFileName = 'E:\mymessage.txt'
[xml]$xmlDoc = Get-Content $xmlFileName
Писать-хост $xmlDoc.Примечание.парам1
но все равно он не вернул содержимое par1. Не могли бы вы поделиться командой powershell, которую вы использовали для доступа к нему.
0x01AA
Извините за мой ленивый "тест". Я использовал только XMLNotepad для "теста". Теперь, попробовав это с помощью powershell, я вижу, что это не работает, и похоже, что это невозможно. Смотрите здесь не принятый ответ: powershell - как включить фрагмент XML-кода в XML - документ-переполнение стека[^]
[Редактировать]
И еще более странно: как только xml имеет внешнюю ссылку, такие свойства, как "to", "from" из основного xml, больше не доступны powershell...
0x01AA
К вашему сведению: старайтесь изо всех сил найти способ решить эту проблему, но и безрезультатно :(
$resolver = New-Object System.Xml.XmlUrlResolver
$resolver.Credentials= [System.Net.CredentialCache]::DefaultCredentials
$xmlDoc1 = New-Object System.Xml.XmlDocument
$xmlDoc1.XmlResolver = $resolver
$xmlDoc1.Load(".\mymessage_header1.txt.xml")
Write-Host "Start Test1"
Write-Host $xmlDoc1.note.from
Write-Host $xmlDoc1.note.par1
Write-Host "Test1 Done"
0x01AA
Маленький шаг вперед:
$resolver = New-Object System.Xml.XmlUrlResolver
$resolver.Credentials= [System.Net.CredentialCache]::DefaultNetworkCredentials
$xmlDoc1 = New-Object System.Xml.XmlDocument
$xmlDoc1.XmlResolver = $resolver
$xmlDoc1.Load(".\mymessage_header1.txt.xml")
$xmlDoc1.note | Format-Table -AutoSize
$notes = $xmlDoc1.selectNodes("//note//par1")
$notes
Write-Output $notes
Последний $notes
и Write-Output $notes
выведите ожидаемую строку "не забудь меня в эти выходные!" пока Write-Host $notes
выводит пустую строку
Gerry Schmitz
Это наводит меня на мысль использовать лапшу вместо удочки. Может быть, попробовать "язык более высокого уровня", который вы можете использовать в долгосрочной перспективе.