Разбор XML и игнорирование разделов с powershell - PullRequest
0 голосов
/ 13 ноября 2018

Я хочу проанализировать ключевые поля и информацию таблицы данных отсюда с помощью PowerShell.

Я хочу получить имя, доступное только для данных, если есть ключевое поле, поэтому в приведенном ниже примере я не хочу CC: Атрибут.

Я также хочу вывести вещи в текстовый файл.

Я хочу, чтобы был создан текстовый файл, который содержит имя таблицы данных и доступ, а также все ключевые поля и чтоони есть.

Это код, который у меня пока есть:

[xml]$global:xmldata = get-content "C:\hackathon\Mfg.xml"

$xmldata2 = $xmldata.SchemaPackage.Tables


$SField = $xmldata2.DataTable.KeyFields | %{$_.StringField} 
$Reffield = $xmldata2.DataTable.KeyFields | %{$_.ReferenceField} 
$table = $xmldata2 | %{$_.DataTable}

Файл XML:

<?xml version="1.0" encoding="utf-8"?>
<SchemaPackage Namespace="Mfg" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <DataTable Name="CC::Attribute">
        <DataFields>
        </DataFields>
    </DataTable>

    <DataTable Name="PlannerCode" Access="WW">
        <Licenses>Manufacturing, DemandManagement</Licenses>
        <Flags>
        </Flags>
        <KeyFields>
            <StringField Name="Value"/>
            <ReferenceField Name="Site" Target="Core::Site" SetField="PlannerCodes"/>
        </KeyFields>
        <DataFields>
            <StringField Name="Description"/>
        </DataFields>
    </DataTable>
</SchemaPackage>

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Поскольку мы работаем с XML, одним из вариантов запросов является XPath!

Вы можете выбрать только DataTable узлы, у которых есть дочерний элемент KeyFields со следующим выражением XPath:

/SchemaPackage/DataTable[KeyFields]

Вы можете использовать Select-Xml:

Select-Xml -Path C:\hackathon\Mfg.xml -XPath /SchemaPackage/DataTable[KeyFields] |Select-Object -Expand Node

или передайте выражение в качестве аргумента методу SelectSingleNodes():

[xml]$xmldata = Get-Content C:\hackathon\Mfg.xml
$xmldata.SelectNodes('/SchemaPackage/DataTable[KeyFields]')
0 голосов
/ 13 ноября 2018

Несмотря на сделанные вами изменения, я могу получить ваш XML для проверки, только если я слегка его изменю (очистив открывающий тег XML и удалив пространство имен SchemaPackage).В любом случае, если у вас нет проблем с импортом XML, тогда все в порядке.

Здесь я просто создаю объект XML из herestring , потому что у меня его нет вфайл на диске.

[xml]$xmldata = @"
<xml>
    <DataTable Name="CC::Attribute">
        <DataFields>
        </DataFields>
    </DataTable>
    <DataTable Name="PlannerCode">
        <Licenses>Manufacturing, DemandManagement</Licenses>
        <Flags>
        </Flags>
        <KeyFields>
            <StringField Name="Value"/>
            <ReferenceField Name="Site" Target="Core::Site" SetField="PlannerCodes"/>
        </KeyFields>
        <DataFields>
            <StringField Name="Description"/>
        </DataFields>
    </DataTable>
</xml>
"@

# Filter DataTable nodes for those with a KeyFields child node.
$DataTablesWithKeyFields = $xmldata.xml.DataTable | Where-Object { $_.KeyFields }

$DataTableName = $DataTablesWithKeyFields.Name
$StringFieldData = $DataTablesWithKeyFields.KeyFields.ReferenceField
$ReferenceFieldData = $DataTablesWithKeyFields.KeyFields.ReferenceField

Я не уверен, что вы ищете.$DataTablesWithKeyFields может быть массивом в зависимости от вашего XML-файла, поэтому вам может потребоваться зациклить его для извлечения необходимой информации.

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