How to read xml value with Powershell - powershell

<?xml version="1.0" encoding="utf-8"?>
<Foo>
<Tier Path="\\10.10.44.61\Case Study\" />
<Force Path="\\10.10.44.61\Orto Study" Atomic="False" />
</Foo>
How can I read in powershell Tier Path value?
I am expecting to get the value of \\10.10.44.61\Case Study\

$xml = '<?xml version="1.0" encoding="utf-8"?>
<Foo>
<Tier Path="\\10.10.44.61\Case Study\" />
<Force Path="\\10.10.44.61\Orto Study" Atomic="False" />
</Foo>'
([xml]$xml).Foo.Tier.Path
As long as you are using an xml type (which I do by casting) you can reference the path directly as members of the object.

Related

What is wrong with my layer.xml from netbeans?

I try to create a new palette in netbeans 10, but the following 2 errors don't allow me to compile the project:
Document root element "folder", must match DOCTYPE root "JavaPalette". [3]
The markup in the document following the root element must be well-formed. [11]
My XML looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<folder name="JavaPalette">
<folder name="Items">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javasourcefilepalette.Bundle"/>
<file name="Item.xml" url="resources/Item.xml">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javasourcefilepalette.Bundle"/>
</file>
</folder>
</folder>
<filesystem/>
I have no clue what both error messages mean, but i did exactly what is said in the tutorial.
Online validation of the xml file also shows that error.
https://platform.netbeans.org/tutorials/nbm-palette-api2.html
I didn´t followed the tutorial, but as far as i can tell, your filesystem tag is not valid. If you take a look at the DTD you can see that the element filesystem isn´t declared as EMPTY (for more information you can read more about it here). So you have to provide a start and end tag. In your posted example you are only using <filesystem/> which isn´t allowed.
You have to change the xml as follows:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
<filesystem>
<folder name="JavaPalette">
<folder name="Items">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javasourcefilepalette.Bundle"/>
<file name="Item.xml" url="resources/Item.xml">
<attr name="SystemFileSystem.localizingBundle" stringvalue="org.netbeans.modules.javasourcefilepalette.Bundle"/>
</file>
</folder>
</folder>
</filesystem>

Extra namespace in xsl output eclipse

Since our company is moving from AX to SAP I'm also making a 'shift' from visual studio to eclipse. I'd thought it would be nice to start with a small xslt project but when trying my existing (made in VS) xsl I noticed some differences.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="#*|node()">
<xsl:copy>
<xsl:apply-templates select="#*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="msxsl:SalesType">
<xsl:choose>
<xsl:when test="(../msxsl:SalesType) = 'ReturnItem'">
<xsl:element name="MessageType" namespace="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">384</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:element name="MessageType" namespace="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">380</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Generates an output xml with msxsl prefix xmlns:msxsl="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">380:
<?xml version="1.0" encoding="UTF-8"?>
<Envelope
xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{0E415D3C-6D46-4E4E-B8CA-9729B11BA}</MessageId>
<SourceEndpoint>BAB</SourceEndpoint>
<DestinationEndpoint>INVOIC_WKMP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesInvoiceService/read
</Action>
</Header>
<Body>
<MessageParts>
<SalesInvoice xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">
<CustInvoiceJour class="entity">
<AccountcategoryId>FFF</AccountcategoryId>
<msxsl:MessageType
xmlns:msxsl="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">380</msxsl:MessageType>
</CustInvoiceJour>
</SalesInvoice>
</MessageParts>
</Body>
</Envelope>
Whereas visual studio xsl leaves out the xmlns:msxsl specification (which is correct):
<?xml version="1.0" encoding="utf-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/Message">
<Header>
<MessageId>{0E415D3C-6D46-4E4E-B8CA-9729B11BA}</MessageId>
<SourceEndpoint>BAB</SourceEndpoint>
<DestinationEndpoint>INVOIC_WKMP</DestinationEndpoint>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/SalesSalesInvoiceService/read</Action>
</Header>
<Body>
<MessageParts>
<SalesInvoice xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice">
<CustInvoiceJour class="entity">
<AccountcategoryId>FFF</AccountcategoryId>
<MessageType>380</MessageType>
</CustInvoiceJour>
</SalesInvoice>
</MessageParts>
</Body>
</Envelope>
Since it’s already in the http://schemas.microsoft.com/dynamics/2008/01/documents/SalesInvoice namespace
I don’t want this addition here. Is there anything I can do to change this in eclipse?
Kind regards,
Mike
No, Visual Studio is NOT correct to omit this namespace. If you don't want it included you should explicitly omit it using xsl:exclude-result-prefixes="msxsl".

Powershell: XPath cannot select when element has "xmlns" tag?

I've got a very simple xml, as below:
<?xml version="1.0" encoding="utf-8"?>
<First>
<Second>
<Folder>today</Folder>
<FileCount>10</FileCount>
</Second>
<Second>
<Folder>tomorrow</Folder>
<FileCount>90</FileCount>
</Second>
<Second>
<Folder>yesterday</Folder>
<FileCount>22</FileCount>
</Second>
</First>
Then I have a powershell script to select "Folder" element:
[xml]$xml=Get-Content "D:\m.xml"
$xml.SelectNodes("//Folder")
It outputs:
#text
-----
today
tomorrow
yesterday
No problem. But if I change the xml file to add "xmlns="http://schemas.microsoft.com/developer/msbuild/2003" to "First" like below:
<?xml version="1.0" encoding="utf-8"?>
<First xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Second>
<Folder>today</Folder>
<FileCount>10</FileCount>
</Second>
<Second>
<Folder>tomorrow</Folder>
<FileCount>90</FileCount>
</Second>
<Second>
<Folder>yesterday</Folder>
<FileCount>22</FileCount>
</Second>
</First>
Then, my powershell script outputs nothing.
Why? How to change my powershell script to support this xmlns?
Thanks a lot.
What you added is default namespace. Unlike prefixed namespace, descendant elements inherit ancestor default namespace implicitly, unless otherwise specified (using explicit prefix or local default namespace that points to different URI).
To select element in namespace, you'll need to define prefix that point to the namespace URI and use that prefix properly in your XPath, for example :
$ns = New-Object System.Xml.XmlNamespaceManager($xml.NameTable)
$ns.AddNamespace("d", $xml.DocumentElement.NamespaceURI)
$xml.SelectNodes("//d:Folder", $ns)

Transform referenced XML

I have a pipeline question.
I have a workflow where I have a master XML that references multiple XML files. It would be similar to a DITA map, but this is not DITA.
I am having to run an XSLT on the master XML to prepare it for a downstream process for output to the web or other medium.
Part of this transform includes resolving database file paths to relative file paths within the package that is exported from the content management system.
I can perform the transformation on the master XML just fine. However, my question involves running a XSLT on the referenced XML files. They also need the paths corrected.
Here is a simple sample...
<master>
<reference url="x-database01.xml"/>
</master>
The reference will resolve to something like url="/files/realXMLname.xml". The problem is that I don't know how to then transform realXMLname.XML to resolve the paths there.
<content>
<graphic href="x-database02.jpg"/>
</content>
The database and the downstream process are 2 different software packages with an out-of-the-box integration. I could write my own pipeline to do the transforms, but it may be cost prohibitive. The current integration only allows for 1 XSLT to be run a the pre-process step.
Is it possible to transform referenced XML files in a single XSLT transform step?
The following setup uses a main input XML input.xml which only contains a root node and two other XML files part1.xml and part2.xml which are read using the document() function. The XSLT uses <xsl:apply-templates> to trigger the conversion of the union of the two XML files. This way it should be possible to combine any number of XML files beforehand into one tree and execute the XSLT process on the resulting tree.
By the way: It turns out that this is already supported in XSLT 1.0 (at least by the xsltproc processor).
File input.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root/>
File part1.xml:
<?xml version="1.0" encoding="ISO-8859-1"?>
<root1>
<element>
<subelement1 message="Hello from part1.xml"/>
</element>
</root1>
File 'part2.xml':
<?xml version="1.0" encoding="ISO-8859-1"?>
<root2>
<element>
<subelement2 message="Hello from part2.xml"/>
</element>
</root2>
With the input above the following XSLT transformation
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:variable name="part1" select="document('part1.xml')/root1"/>
<xsl:variable name="part2" select="document('part2.xml')/root2"/>
<xsl:template match="/">
<messages>
<xsl:apply-templates select="$part1|$part2"/>
</messages>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="text()"/>
<xsl:template match="subelement1">
<message>
<xsl:value-of select="#message"/>
</message>
</xsl:template>
<xsl:template match="subelement2">
<message>
<xsl:value-of select="#message"/>
</message>
</xsl:template>
</xsl:stylesheet>
yields this output:
<?xml version="1.0" encoding="UTF-8"?>
<messages>
<message>Hello from part1.xml</message>
<message>Hello from part2.xml</message>
</messages>

NANT: Style task passing parameter to xslt

I have a problem with passing arguments from the NAnt style task to a xslt sheet.
This is my NAnt code snippet. The properties path and file are definetly set.
<style style="${xslt.file}" extension="xml" in="${xml.file}" destdir=".">
<parameters>
<parameter name="path" value="${path}"
namespaceuri="http://www.w3.org/1999/XSL/Transform" />
<parameter name="doc" value="${file}"
namespaceuri="http://www.w3.org/1999/XSL/Transform" />
</parameters>
</style>
My Parameter are declared as following:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="http://schemas.microsoft.com/developer/msbuild/2003">
<xsl:param name="path"></xsl:param>
<xsl:param name="file" />
And accessed by:
<xsl:value-of select="$path" />
<xsl:value-of select="$file" />
But when the file is transformed, $path and $file are both empty. I have tried with and without the namespaceuri of the style task.
What I am doing wrong?
Thanking you in anticipation.
Hmmm, why do you set $file and use $doc ?
BTW, here is a working example:
<style style="web.config.xsl" in="web.config.xsl" out="web.config">
<parameters>
<parameter name="OSVersion" value="${OSVersion}"/>
</parameters>
</style>
and the XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="OSVersion"/>
<xsl:template match="/">
<xsl:value-of select="$OSVersion"/>
</xsl:template>
</xsl:stylesheet>
I just encountered the phenomenon Dennis described in his comment on the first answer. It seems that NAnt only executes the XSLT again if it has changed and doesn't notice that you have changed the parameters for the <style> element. Hence, once you have added your <parameter> elements to your NAnt file, running NAnt will not cause the XSLT to run with the new parameter values unless you have changed the XSLT file itself.