Используйте Xpath для поиска значения имени поля и распечатайте другой атрибут, если утверждение верно - PullRequest
0 голосов
/ 24 января 2020

В настоящее время я ищу способ поиска xml -файла и отображения атрибута, если условие выполнено.

* xml -файл выглядит так

<Import xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Category Name="Personen-Stellen-Import">
    <Record>
       <Field FieldName="Person.EmailGeschaeft">
        <String>bla.blup1@ospelt.com</String>
      </Field>
      <Field FieldName="Person.IstReferent">
        <String>1</String>
      </Field>
    </Record>
    <Record>
      <Field FieldName="Person.EmailGeschaeft">
        <String>bla.blup2@ospelt.com</String>
      </Field>
      <Field FieldName="Person.IstReferent">
        <String>0</String>
      </Field>
    </Record>
    <Record>
      <Field FieldName="Person.EmailGeschaeft">
        <String>bla.blup3@ospelt.com</String>
      </Field>
      <Field FieldName="Person.IstReferent">
        <String>0</String>
      </Field>
    </Record>
    <Record>
      <Field FieldName="Person.EmailGeschaeft">
        <String>bla.blup4@ospelt.com</String>
      </Field>
      <Field FieldName="Person.IstReferent">
        <String>1</String>
      </Field>
    </Record>
  </Category>
</Import>

Каждый человек имеет свои записи между <rekord> and </rekord>. Теперь, если строка под Field Fieldname = "Person.IstReferent" соответствует 1, она должна напечатать E-Mail с указанным c Person. Электронная почта хранится в строке ниже FieldName"Person.EmailGeschaeft. Знаете ли вы какой-нибудь способ создания сценария powershell, который может отображать все электронные письма, соответствующие условию, и печатать их в файле или отображать?

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Ответ мудреца Пурпре идеален. Короче XPath:

//String[text()="1"]/preceding::String[1]/text()
1 голос
/ 24 января 2020

Это определенно возможно. Во-первых, вам нужно загрузить файл XML и преобразовать его в XML, используя [xml]$xml = Get-Content -Path 'YourXml.xml' -Raw

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

Вот что необходимо для достижения sh именно этого.

[xml]$xml = Get-Content -Path 'YourXml.xml' -Raw
$MatchingNodes= Select-xml -Xml $xml -XPath '//*[Field[@FieldName="Person.IstReferent"]/String[text() =1]]/Field[@FieldName="Person.EmailGeschaeft"]/String[text()]'
$Emails = $MatchingNodes.Node.'#text' 

Вы получите следующий результат.

bla.blup1@ospelt.com 
bla.blup4@ospelt.com

Используемый синтаксис XPATH можно разложить в следующим образом.

//*[Field[@FieldName="Person.IstReferent"]/String[text() =1]]/Field[@FieldName="Person.EmailGeschaeft"]/String[text()]
  • //Field найти все теги полей
  • //*[ Найти все, что находится в скобках, но возвращает узлы на этом уровне, а не давать ребенку .
  • Field[@FieldName="Person.IstReferent" Атрибут FieldName со значением Person.IstReferent как дочерний элемент узла Field.
  • /String[text()=1] Узел String должен иметь значение 1

Затем, если вы объедините эту первую часть, вы получите

//*[Field[@FieldName="Person.IstReferent"]/String[text() =1]]

Что означает: «Найти узел, соответствующий этому условию c, но вместо этого предоставьте мне узел на уровне поля вместо значение 1 (Вот почему у вас есть * [ так Вы вернетесь к этому уровню. От этого соответствующего Record узла мы перейдем к тому, что нам на самом деле нужно.

/Field[@FieldName="Person.EmailGeschaeft"]/String[text()]
  • Узел поля, который содержит атрибут FieldName , соответствующий Person.EmailGeschaeft с дочерним узлом с именем String
  • [Text()] - это синтаксис, который говорит о том, что мы хотим получить значение этого узла.

Ссылка

Выбор- xml

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...