Jump to page: 1 2
Thread overview
kxml - parsing AWS API xml respond
Oct 19, 2015
holo
Oct 19, 2015
Kagamin
Oct 19, 2015
holo
Oct 19, 2015
holo
Oct 19, 2015
Kagamin
Oct 19, 2015
holo
Oct 19, 2015
Kagamin
Oct 19, 2015
holo
Oct 20, 2015
holo
Oct 20, 2015
Kagamin
Oct 20, 2015
opticron
Oct 20, 2015
holo
Oct 21, 2015
opticron
October 19, 2015
I'm trying to take out from AWS respond needed information. Here is cut off part of example respond:

...
                    <instanceId>i-xxxxx</instanceId>
                    <imageId>ami-xxxxx</imageId>
                    <instanceState>
                        <code>16</code>
                        <name>running</name>
                    </instanceState>
                    <privateDnsName>ip-xxxxxxx.ec2.internal</privateDnsName>
                    <dnsName>ec2-xxxxxx.compute-1.amazonaws.com</dnsName>
                    <reason/>
                    <keyName>ec2key</keyName>
                    <amiLaunchIndex>0</amiLaunchIndex>
                    <productCodes>
                        <item>
                            <productCode>xxxxxxxxxxxxxxxxxxxx</productCode>
                            <type>marketplace</type>
                        </item>
                    </productCodes>
                    <instanceType>c3.large</instanceType>
                    <launchTime>2015-08-18T16:51:11.000Z</launchTime>
...

With such code im getting only information about all instance ids:

    string xmlstring = cast(string)read("test.xml");
    XmlNode newdoc = xmlstring.readDocument();
    XmlNode[]  searchlist = newdoc.parseXPath("//instanceId");
    writeln(searchlist);

What i need is that to take out from there instance id and eg LaunchTime for that instance. How can i do it using kxml?

Why there is needed that "//" before tag? In other way im not getting any respond. What is interesting when i do that same with first tag appearing in respond it is not needed. From other hand with "///" i'm getting much more information but not separated by coma.

How to drop tags from respond? I have such result of parsing by id tag:

<instanceId>i-xxxxxx</instanceId>

I need only value. Is there some equivalent to ".text" from std.xml?
October 19, 2015
On Monday, 19 October 2015 at 04:49:25 UTC, holo wrote:
> Why there is needed that "//" before tag?

That's an XPath expression.

> How to drop tags from respond? I have such result of parsing by id tag:
>
> <instanceId>i-xxxxxx</instanceId>
>
> I need only value. Is there some equivalent to ".text" from std.xml?

Try getCData https://github.com/opticron/kxml/blob/master/source/kxml/xml.d#L309
October 19, 2015
On Monday, 19 October 2015 at 11:53:08 UTC, Kagamin wrote:
> On Monday, 19 October 2015 at 04:49:25 UTC, holo wrote:
>> Why there is needed that "//" before tag?
>
> That's an XPath expression.
>

Need, to read about that XPaths.


>> How to drop tags from respond? I have such result of parsing by id tag:
>>
>> <instanceId>i-xxxxxx</instanceId>
>>
>> I need only value. Is there some equivalent to ".text" from std.xml?
>
> Try getCData https://github.com/opticron/kxml/blob/master/source/kxml/xml.d#L309


getCData is working like expected.

Thank you for tips.
October 19, 2015
Sorry i was trying to use that XPaths to take out instanceId and laounchTime but i always get an empty respond.

//instanceId/launchTime" - empty
//instanceId/*           - empty too
//instanceId.launchTime  - empty too

How to take instance id and variable which im interest in or few/all for instanceId?
October 19, 2015
Select parent tags and get data from their child tags like instanceId.
October 19, 2015
On Monday, 19 October 2015 at 12:54:52 UTC, Kagamin wrote:
> Select parent tags and get data from their child tags like instanceId.

void main()
{
    string xmlstring = cast(string)read("test.xml");
    XmlNode newdoc = xmlstring.readDocument();
    XmlNode[]  searchlist = newdoc.parseXPath("//instanceId");
    XmlNode[] searchlist2 = searchlist.parseXPath("//launchTime");
        writeln(searchlist2);
}

Not working but probably its not what you thought, how to select it do you have some example?
October 19, 2015
If you don't want parent tag, then:
XmlNode[] searchlist2 = newdoc.parseXPath("//launchTime");
October 19, 2015
On Monday, 19 October 2015 at 16:12:56 UTC, Kagamin wrote:
> If you don't want parent tag, then:
> XmlNode[] searchlist2 = newdoc.parseXPath("//launchTime");

I wanted parent tag, i think. I almost figure out what i needed, but getCData stops working :/

void main()
{
    string xmlstring = cast(string)read("test.xml");
    XmlNode newdoc = xmlstring.readDocument();
    XmlNode[]  searchlist = newdoc.parseXPath("//instancesSet/item");

    foreach(list, searchlist)
    {
    string test = list.parseXPath("instanceId").getCData();
    writeln(test);
    }
}

[holo@ultraxps test]$ dub
Performing "debug" build using dmd for x86_64.
kxml 1.0.0: target for configuration "library" is up to date.
test ~master: building configuration "application"...
source/app.d(20,57): Error: no property 'getCData' for type 'XmlNode[]'
dmd failed with exit code 1.
[holo@ultraxps test]$

October 20, 2015
I have no idea what i'm doing, but i did it (i just choose 1 element of array):

void main()
{
    string xmlstring = cast(string)read("test.xml");
    XmlNode newdoc = xmlstring.readDocument();

    XmlNode[]  searchlist = newdoc.parseXPath(`//instancesSet/item`);
    foreach(list; searchlist)
    {
        string test1 = list.parseXPath(`//instanceId`)[0].getCData;

        writeln(test1);
    }

}

Is it really how it should looks like? Is there any better/more beautiful solution?
October 20, 2015
You can write a helper:
XmlNode selectSingleNode(XmlNode src, string path)
{
  XmlNode[] nodes = src.parseXPath(path);
  return nodes.length==0 ? null : nodes[0];
}

Then:
string test1 = node.selectSingleNode(`//instanceId`).getCData();
« First   ‹ Prev
1 2