Считать значения атрибутов XML на основе другого значения атрибута в том же узле с помощью Powershell

Шаблоны должны использоваться в заголовках, потому что компилятор должен создавать экземпляры разных версий кода в зависимости от параметров, заданных / выведенных для параметров шаблона. Помните, что шаблон не представляет собой код напрямую, а шаблон для нескольких версий этого кода. Когда вы компилируете функцию non-template в файле .cpp, вы компилируете конкретную функцию / класс. Это не относится к шаблонам, которые могут быть созданы с использованием разных типов, а именно, если при замене параметров шаблона конкретными типами необходимо исправить конкретный код.

Была функция с ключевым словом export, которая была предназначенный для отдельной компиляции. Функция export устарела в C++11 и, AFAIK, только один компилятор реализовал ее. Вы не должны использовать export. Отдельная компиляция невозможна в C++ или C++11, но, возможно, в C++17, если понятия в нее входят, мы могли бы иметь некоторый способ отдельной компиляции.

Для отдельной компиляции, которая должна быть достигнута, разделить проверка шаблона тела должна быть возможна. Кажется, что решение возможно с концепциями. Взгляните на этот документ , недавно представленный на совещании по стандартам. Я думаю, что это не единственное требование, поскольку вам все равно необходимо создать код кода шаблона в коде пользователя.

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

0
задан Ansgar Wiechers 16 January 2019 в 11:48
поделиться

2 ответа

Поскольку ваш атрибут Name следует сравнивать в режиме нечувствительности к регистру, я предлагаю что-то вроде этого:

[xml]$xml = @"
<Tag1>
<Tag2>      
  <file Name="file1.rdl" Path="folder34" />
  <File Name="file2.rdl" Path="folder37" />
  <File Name="file3.rdl" Path="folder34" />
  <File Name="File4.rdl" Path="folder76" />
  <File Name="file5.rdl" Path="folder37" />
</Tag2>
</Tag1>
"@

$AttribureReportName = "File4.rdl"

foreach ($item in ($xml.Tag1.Tag2.file | Where-Object {

Поскольку ваш атрибут Name следует сравнивать в режиме нечувствительности к регистру, я предлагаю что-то вроде этого:

[110].Name -eq $AttribureReportName})) { $item.Path }
0
ответ дан Theo 16 January 2019 в 11:48
поделиться

Во-первых, это неправильно:

[xml]$XmlDocument = Get-Content "D:\Roshan\Testing\Test1.xml"

Не загружайте XML-файлы таким образом, это может вызвать проблемы с кодировкой. У синтаксических анализаторов XML есть продуманный механизм автоматического определения кодировки. В Get-Content такого нет, поэтому есть большая вероятность, что файл XML загружен с неправильной кодировкой, а данные внутри повреждены.

Используйте синтаксический анализатор XML для загрузки файла.

$XmlDocument = New-Object xml
$XmlDocument.Load("D:\Roshan\Testing\Test1.xml")

После этого вы можете использовать XPath, чтобы выбрать нужный узел из файла. Это будет намного быстрее, чем писать любые циклы Powershell самостоятельно (Where-Object также является циклом).

$File = $XmlDocument.SelectSingleNode("/Tag1/Tag2/File[@Name = 'File4.rdl']")
Write-Host $File.Path
0
ответ дан Tomalak 16 January 2019 в 11:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: