Hi Tommi,

thank you for your reply!

Here is an example which is in a format I would like to parse in real life:
-----------------------------------------------------------------
<?xml version="1.0" encoding="ISO-8859-1"?>
<head>
<OneGroup>
    <OneGroupId OneGroupAttrib="TTT">998877</OneGroupId>
</OneGroup>
<SecondGroup>
    <TheField attribNameA="AAA"
attribNameB="BBB">someValueofTheField</TheField>
    <InnerGroup attribName1="AttrContent" attribName2="SecondAttribContent">
        <TagName>TATATA</TagName>
    </InnerGroup>
</SecondGroup>
</head>
-----------------------------------------------------------------

With the current cxxtools implementation it would look like this:
-----------------------------------------------------------------
name = "head"
node[0]
        name = "OneGroup"
        typeName = OneGroup
        node[0]
                name = "OneGroupId"
                type = string
                value = "998877"
                typeName = OneGroupId
node[1]
        name = "SecondGroup"
        typeName = SecondGroup
        node[0]
                name = "TheField"
                type = string
                value = "someValueofTheField"
                typeName = TheField
        node[1]
                name = "InnerGroup"
                typeName = InnerGroup
                node[0]
                        name = "TagName"
                        type = string
                        value = "TATATA"
                        typeName = TagName
name = "OneGroup"
typeName = OneGroup
node[0]
        name = "OneGroupId"
        type = string
        value = "998877"
        typeName = OneGroupId
name = "SecondGroup"
typeName = SecondGroup
node[0]
        name = "TheField"
        type = string
        value = "someValueofTheField"
        typeName = TheField
node[1]
        name = "InnerGroup"
        typeName = InnerGroup
        node[0]
                name = "TagName"
                type = string
                value = "TATATA"
                typeName = TagName
-----------------------------------------------------------------


How could OneGroupId be reflected to see that it has
- an attribute with typeName "OneGroupAttrib" and value "TTT"
- and a value of 998877?

Suggestion:
     node[0]
                name = "OneGroupId"
                type = string
                value = "998877"
                typeName = OneGroupId
                attributes = {[OneGroupAttrib, TTT]}


How could InnerGroup be reflected to see that it has
- an attribute with typeName "attribName1" and value "AttrContent"
- a second attribute with typeName "attribName2" and value
"SecondAttribContent"
- and a Tag with typename "TagName" and content "TATATA"

 node[1]
                name = "InnerGroup"
                typeName = InnerGroup
                attributes = { [attribName1,AttrContent] ,
[attribName2,SecondAttribContent] }
                node[0]
                        name = "TagName"
                        type = string
                        value = "TATATA"
                        typeName = TagName

Since the attributes are never hierachical, a good way could be to return
the attribues in a new function like this "map<string, string>
getAttributes()".

What do you think?

Best regards,
Raphael




Am 12.11.2014 um 18:54 schrieb Tommi Mäkitalo:

Hi,

the xml deserializer does not read XML attributes. So no luck currently.

But we can change it if desired. I've thought about it.

Lets first look at the problem. The deserializer actually converts a xml
structure into a cxxtools::SerializationInfo. The SerializationInfo node
has a value, a name, a type, a category and a vector of nodes. So the
deserializer has to somehow pack all information from the XML structure
into the SerializationInfo.

The name and the type are strings. The category may be Void, Value, Object
or Array. The value is a union which takes a scalar value.

When we have a structure like:

  <foo><bar>value</bar></foo>

the serializationinfo will have one subnode with the name "bar" and the
string value "value". The <foo> node may contain the attributes "type" and
"category". The "type" is put into the type field and the category may have
the value "array", "struct" or "value" and is converted to the enum.

So there is actually nothing, we can put arbitrary attributes into. When we
have:

  <foo baz="42"><bar>value</bar></foo>

the deserializer do not know what to do with the attribute "baz" and hence
ignores it.

A solution, which comes into my mind is to add an option into the
deserializer to convert the attributes also to a sub node. When enabled,
the deserializer will convert the above structure into a SerializationInfo
with 2 sub nodes. One with the name "baz" and the other "bar". But in that
case we can't distinguish between a attribute and a subnode. Maybe we can
set the category of the subnode (<bar> in that case) to Array since it
potentially can have other subnodes. We get an empty array with a name then.

That is quite easy to implement and feel, that it would be useful in the
future.

I know that it is not that easy to understand and for me not that easy to
explain. I hope, that you can see, what I try to achieve.


Tommi


Am 10.11.2014 um 17:45 schrieb Raphael Fuchs:

 Hello,

I want to read the following xml with all the fields and attributes:

---------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="ISO-8859-1"?>
<rootelement someId="11756">
    <subgroup subgroupId="25">
        <someString>this is a string</someString>
    </subgroup>
</rootelement>
---------------------------------------------------------------------------------------------


But I cannot read the attributes "someId" and "subgroupId".

I tried with the following code that just prints to the logfile:

---------------------------------------------------------------------------------------------

void operator>>= (const cxxtools::SerializationInfo& si, Dummy& fields)
{
    size_t count = si.memberCount();
    log_info("root: " << si.name());

    for (size_t idx = 0; idx < count; ++idx)
    {
        // get current field
        cxxtools::SerializationInfo oneField = si.getMember(idx);

        if (oneField.memberCount() > 0) // it is a group
        {
            log_info("Group: " << oneField.typeName());
            // keep name of current parent in mind
            parentName.push(oneField.typeName());

            oneField >>= fields;

            // get rid of the last groupname
            parentName.pop();
        }
        else
        {
            std::string value;
            oneField.getValue(value);
            log_info("Field: " << oneField.typeName() << ": " << value);
        }
    }
}
---------------------------------------------------------------------------------------------



Could someone give me a hint on how to read the attributes?

Cheers
Raphael



------------------------------------------------------------------------------



_______________________________________________
Tntnet-general mailing
[email protected]https://lists.sourceforge.net/lists/listinfo/tntnet-general




------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications.
Take corrective actions from your mobile
device.http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk



_______________________________________________
Tntnet-general mailing
[email protected]https://lists.sourceforge.net/lists/listinfo/tntnet-general



-- 
Comyno Ltd.
Mainzer Landstrasse 46
60325 Frankfurt
www.comyno.com
------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications.
Take corrective actions from your mobile device.
http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk
_______________________________________________
Tntnet-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tntnet-general

Reply via email to