2014-10-01 2 views
3

Я работаю над историческим сценарием, который у меня ограничен.Преобразование system.xml.xmlelement в system.xml.xmldocument с помощью PowerShell

Объект A имеет тип system.xml.xmlelement, и для его сравнения с объектом B (тип system.xml.xmldocument) это нужно преобразовать, чтобы ввести system.xml.xmldocument.

Сценарий в настоящее время пытается сделать прямое преобразование, которое кидает с:

Cannot convert value System.Xml.XmlElement to type System.Xml.XmlDocument . Error: "The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong type."

Я думаю, что нужно создать новый объект system.xml.xmldocument и импортировать узел из объекта А в новый объект, а затем сделать сравнение на новый объект с объектом B. Я боюсь с правильным синтаксисом, и я не уверен, что это правильный подход.

Любое руководство или помощь будут оценены.

Объект A (XMLElement) выглядит следующим образом:

<Resource xmlns="http://schemas.microsoft.com/windowsazure"> 
    <ResourceProviderNamespace>cacheservice</ResourceProviderNamespace> 
    <Type>Caching</Type> 
    <Name>xxx</Name> 
    <SchemaVersion>1.0</SchemaVersion> 
    <ETag>xxx</ETag> 
    <State>Started</State> 
    <SubState>Active</SubState> 
    <UsageMeters /> 
    <IntrinsicSettings> 
     <CacheServiceInput xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
      <SkuType>Basic</SkuType> 
      <Location>North Europe</Location> 
      <SkuCount>1</SkuCount> 
      <ServiceVersion>1.3.0</ServiceVersion> 
      <ObjectSizeInBytes>1024</ObjectSizeInBytes> 
      <NamedCaches> 
       <NamedCache> 
        <CacheName>default</CacheName><NotificationsEnabled>false</NotificationsEnabled> 
        <HighAvailabilityEnabled>false</HighAvailabilityEnabled> 
        <EvictionPolicy>LeastRecentlyUsed</EvictionPolicy> 
        <ExpirationSettings> 
        <TimeToLiveInMinutes>10</TimeToLiveInMinutes> 
        <Type>Absolute</Type> 
        </ExpirationSettings> 
       </NamedCache> 
      </NamedCaches> 
     </CacheServiceInput> 
    </IntrinsicSettings> 
    <OutputItems> 
     <OutputItem> 
      <Key>CreationDate</Key> 
      <Value>9/30/2014 9:46:42 AM +00:00</Value> 
     </OutputItem> 
    </OutputItems> 
    <OperationStatus> 
     <Type>Create</Type> 
     <Result>Succeeded</Result> 
    </OperationStatus> 
    <Label /> 
</Resource> 

объект B (XmlDocument) выглядит следующим образом:

<Resource> 
    <IntrinsicSettings> 
     <CacheServiceInput xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
      <SkuType>Basic</SkuType> 
      <Location>North Europe</Location> 
      <SkuCount>1</SkuCount> 
      <ServiceVersion>1.3.0</ServiceVersion> 
      <ObjectSizeInBytes>134217728</ObjectSizeInBytes> 
      <NamedCaches> 
       <NamedCache> 
        <CacheName>default</CacheName> 
        <NotificationsEnabled>True</NotificationsEnabled> 
        <HighAvailabilityEnabled>True</HighAvailabilityEnabled> 
        <EvictionPolicy>True</EvictionPolicy><ExpirationSettings> 
        <TimeToLiveInMinutes>10</TimeToLiveInMinutes> 
        <Type>Absolute</Type> 
        </ExpirationSettings> 
       </NamedCache> 
      </NamedCaches> 
     </CacheServiceInput> 
    </IntrinsicSettings> 
</Resource> 

ответ

0

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

Учитывая следующий фиктивный XML

<?xml version="1.0" encoding="utf-8"?> 
<configuration xmlns="http://dummy"> 
    <CommonRoles> 
     <Role>Role1</Role> 
     <Role>Role2</Role> 
     <Role>Role3</Role> 
    </CommonRoles> 
    <SomethingElse> 
    </SomethingElse> 
</configuration> 

Мы могли бы получить подмножество и преобразовать его в документ следующим образом:

$value = [xml](Get-Content(Join-Path $filePath $roles[0])) 
$commonRoles = $value.configuration.CommonRoles 
$xml = New-Object -TypeName xml 
$xml.AppendChild($xml.ImportNode($commonRoles, $true)) | Out-Null 

В этом случае мы чтение источника xml из файла, а затем выбор вложенного элемента (CommonRoles), который становится нашим объектом XmlElement. Последующие строки создадут новый объект xml и добавят XmlElement к этому объекту. Нам нужно использовать метод ImportNode, поскольку в настоящее время xml принадлежит другому документу, поэтому вам нужно разрешить ему стать частью нового документа.

Труба к Out-Null предотвращает вызов AppendChild, входящего в выход функции.

Смежные вопросы