Как в Powershell увидеть все уровни XML

#powershell

#powershell

Вопрос:

У меня есть тестовый xml, и я хочу получить значение из этой строки АТРИБУТ NAME=»News- offers_OPT_EMAIL»>F, чтобы я мог проверить значение F или T

если я сделаю это ниже, я смогу получить заголовок, но как мне получить указанное выше значение строки.

 [xml]$xml = Get-Content testFile.xml
$xml
$xml.CUSTOMERS.CUSTOMER.NAME.TITLE
  

пример XML-кода

 <?xml version="1.0" encoding="UTF-8"?>
<CUSTOMERS xml:lang="en">
    <CUSTOMER CREATED_DATE="2018-01-01 05:18:53.0" GROUP_ID="" ID="95656565">
        <NAME>
            <TITLE>M</TITLE>
            <FIRST_NAME>Joe</FIRST_NAME>
            <LAST_NAME>Smith</LAST_NAME>
        </NAME>
        <GENDER/>
        <DATE_OF_BIRTH/>
        <ADDRESS>
            <ADDRESS_LINE_1>1 White House</ADDRESS_LINE_1>
            <ADDRESS_LINE_2>Old Ave</ADDRESS_LINE_2>
            <ADDRESS_LINE_3/>
            <TOWNCITY>LONDON</TOWNCITY>
            <COUNTY/>
            <POSTCODE>18659</POSTCODE>
            <COUNTRY>France</COUNTRY>
        </ADDRESS>
        <ADDRESS>
            <ADDRESS_LINE_1>175 avenue de la division Leclerc</ADDRESS_LINE_1>
            <ADDRESS_LINE_2/>
            <ADDRESS_LINE_3/>
            <TOWNCITY>Antony</TOWNCITY>
            <COUNTY/>
            <POSTCODE>92160</POSTCODE>
            <COUNTRY>France</COUNTRY>
        </ADDRESS>
        <CONTACT_DETAILS>
            <TELEPHONE MARKETING_OPT_IN="F" TYPE="MOBILE">0123456789</TELEPHONE>
            <EMAIL MARKETING_OPT_IN="F">johnsmith@gmail.com</EMAIL>
        </CONTACT_DETAILS>
        <ATTRIBUTE NAME="News- offers_OPT_EMAIL">F</ATTRIBUTE>
        <NOTE>NA</NOTE>
    </CUSTOMER>
  

Комментарии:

1. Также добавить это в Powershell

Ответ №1:

Вы могли бы использовать SelectSingleNode или SelectNodes с выражением XPath. Существует несколько вариантов достижения желаемого, в зависимости от ваших намерений, но это будет один из способов сделать это:

 # finde the nodes
$nodes = $xml.SelectNodes("//*[local-name()='ATTRIBUTE'][@NAME='News- offers_OPT_EMAIL']")
# get value
$nodes.InnerText
  

Или, если значение атрибута не имеет значения, просто выполните:

 $xml.customers.customer.attribute.'#text'
  

Комментарии:

1. И последнее, если бы я хотел создать массив из всех значений, помогло бы это для вышеуказанного поля $myArrayList.MYOFFERS = $xml. КЛИЕНТЫ. CUSTOMER.NAME [‘News- offers_OPT_EMAIL’].’#текст’

2. @RogerClerkwell Первый опубликованный мной вариант уже должен возвращать массив значений, если в нем содержится более одного результата $nodes