Joe.wang
Joe.wang

Reputation: 11793

Read XML file which contains namespace PowerShell

All, I am trying to read the Role information from Azure Cloud Service Definition xml file orAzure Cloud Service Configure xml file.

But found XPath does't work for them. Both two xml file contain namespace. By default the namespace doesn't have alias name. and If I add the alias name to it .Visual studio will alert me it is not allowed .

Say your have the Definition like below. and the XmlPath is /ServiceDefinition/WebRole/@vmsize. I tested it in a XPath online tools. and it also can't get the right value for me.

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="test" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2012-10.1.8">
  <WebRole name="test" vmsize="Small">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="HttpsEndpoint" />
          <Binding name="Endpoint2" endpointName="HttpEndpoint" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="HttpsEndpoint" protocol="https" port="443" certificate="Certificate1" />
      <InputEndpoint name="HttpEndpoint" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
    </Imports>
    <Certificates>
      <Certificate name="Certificate1" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
    <ConfigurationSettings>
      <Setting name="LogLevel" />
    </ConfigurationSettings>
  </WebRole>
</ServiceDefinition>

Is there any way to make this XPath work?

Upvotes: 7

Views: 13069

Answers (1)

user189198
user189198

Reputation:

When you use the Select-Xml cmdlet with the -XPath parameter, you also need to specify the namespace. See this article for more information:

http://huddledmasses.org/xpath-and-namespaces-in-powershell/

Here is a complete, working example

$XmlDocument = [xml]@'
<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="test" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2012-10.1.8">
  <WebRole name="test" vmsize="Small">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="HttpsEndpoint" />
          <Binding name="Endpoint2" endpointName="HttpEndpoint" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="HttpsEndpoint" protocol="https" port="443" certificate="Certificate1" />
      <InputEndpoint name="HttpEndpoint" protocol="http" port="80" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
      <Import moduleName="RemoteAccess" />
      <Import moduleName="RemoteForwarder" />
    </Imports>
    <Certificates>
      <Certificate name="Certificate1" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
    <ConfigurationSettings>
      <Setting name="LogLevel" />
    </ConfigurationSettings>
  </WebRole>
</ServiceDefinition>
'@;

$XmlNamespace = @{ azure = 'http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition'; };

Select-Xml -Xml $XmlDocument -XPath '/azure:ServiceDefinition/azure:WebRole/@vmsize' -Namespace $XmlNamespace;

Upvotes: 16

Related Questions