Вывод, который вы получаете, подразумевает, что Invoke-RestMethod
работал должным образом: он возвратил [xml]
(System.Xml.XmlDocument
) экземпляр, который является XML DOM (объектная модель документа) XML текста , возвращенного с сайта.
К сожалению, отображение по умолчанию форматирование для [xml]
экземпляров, как показано в вашем вопросе, не очень полезно [1] , но есть вся информация , которую вы можете просто проверить, открыв .OuterXml
свойство :
# Get the XML DOM object parsed from the website's XML text output.
$xml = Invoke-RestMethod 'http://www.aero-news.net/news/rssfeed.xml'
# Output its text representation.
$xml.OuterXml
Приведенное выше печатает строку, такую как:
<?xml version="1.0" encoding="iso-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://www.aero-news.net">
<title>Aero-News Network</title>
<description>Daily, Real-Time news and information critical to aviation and aerospace personnel the world over. Aero-News provides daily newsletter summaries, RSS feeds, and numerous personal and professional syndication and news distribution options to insure that aviators, the world over, are kept up to date on information of critical concern.</description>
<link>http://www.aero-news.net</link>
...
Поэтому вы можете работать с [xml]
(XmlDocument
) экземпляр как обычно :
Использование Удобная адаптация PowerShell XML DOM через точечную запись на основе свойств ; например, $xml.RDF.channel.about
возвращает строку http://www.aero-news.net
, которая является текстовым содержимым атрибута about
элемента , путь которого (из документа root) равен /RDF/channel
, независимо от пространств имен [2] ; см. этот ответ для получения дополнительной информации.
Использование собственных свойств и методов типа [xml]
, таких как * 1065 на основе XPath * метод для извлечения информации из документа XML; однако это менее удобно, если задействованы XML пространства имен (как в вашем случае), поскольку они требуют явного управления; см. этот ответ для получения дополнительной информации.
Если вы хотите pretty-print XML text :
Тип [xml]
(System.Xml.XmlDocument
) не имеет встроенной поддержки красивой печати его текстового содержимого.
Хотя возможно использование System.Xml.XmlWriter
например, это многословно и громоздко; тем не менее, он предлагает вам контроль над особенностями формата симпатичной печати.
Прагматичным c, гораздо более простым решением является использование System.Xml.Linq.XDocument
вместо этого введите (для которого PowerShell не обеспечивает, к сожалению, точечную запись), чей .ToString()
метод pretty-prints по умолчанию , используя отступ с двумя пробелами, как в следующем примере демонстрирует:
# Create a sample XmlDocument instance, as would be returned
# from an Invoke-RestMethod call (from a site returning XML text):
$xml = [xml] ('<?xml version="1.0"?><catalog><book id="bk101"><title>De Profundis</title></book></catalog>')
# Cast to [System.Xml.Linq.XDocument] via .OuterXml; the former's
# .ToString() method then pretty-prints automatically.
([System.Xml.Linq.XDocument] $xml.OuterXml).ToString()
Выше приведена следующая строка:
<catalog>
<book id="bk101">
<title>De Profundis</title>
</book>
</catalog>
Обратите внимание, что объявление XML включает , а не , но вы можете легко добавить его себя:
$xd = [System.Xml.Linq.XDocument] $xml.OuterXml
$xd.Declaration.ToString() + "`n" + $xd.ToString()
Следующая Format-Xml
вспомогательная функция оборачивает эту функциональность:
function Format-Xml {
param(
[Parameter(ValueFromPipeline)]
[xml] $Xml
)
process {
$xd = [System.Xml.Linq.XDocument] $Xml.OuterXml
if ($xd.Declaration) {
$str = $xd.ToString()
$newline = ("`n", "`r`n")[$str.Contains("`r`n")]
$xd.Declaration.ToString() + $newline + $str
}
else {
$xd.ToString()
}
}
}
Теперь вы можете использовать следующее, чтобы красиво распечатать оригинал $xml
переменная (получена через Invoke-RestMethod
):
# Outputs a pretty-printed version of the document's XML text.
$xml | Format-Xml
[1] Показывается содержимое декларации XML документа как свойства .xml
, и имя элемента документа (root) как свойство названный для себя. Печать любого данного элемента в документе работает следующим образом: если элемент не имеет ни атрибутов, ни дочерних элементов, его текстовое содержимое (текстовый дочерний узел), если таковой имеется, печатается. В противном случае печатаются его атрибуты и их значения, за которыми следуют свойства, названные для дочерних элементов, каждое из которых представляется своим именем также как свойство value , если они сами имеют атрибуты и / или дочерние элементы, в противном случае их текстовое содержимое, если есть.
[2] Пример команды, которая обрабатывает все элементы фида, заголовок которых содержит данное слово, и преобразует их в пользовательские объекты.
$userTerm = 'Quote'
$xml.RDF.Item | ? Title -like "*$userTerm*" | % {
[PSCustomObject]@{
Source = "aero"
Title = $_.Title
Link = $_.Link
Description = $_.description
}
}