getrelax Ответов: 0

Разбивка 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

Это наводит меня на мысль использовать лапшу вместо удочки. Может быть, попробовать "язык более высокого уровня", который вы можете использовать в долгосрочной перспективе.

0 Ответов