dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #24434
Re: Reading nested XML dataset
-
To:
DOLFIN Mailing List <dolfin@xxxxxxxxxxxxxxxxxxx>
-
From:
Anders Logg <logg@xxxxxxxxx>
-
Date:
Thu, 15 Sep 2011 00:23:11 +0200
-
In-reply-to:
<20110914215109.GF1927@smaug>
-
User-agent:
Mutt/1.5.21 (2010-09-15)
I added a utility function get_node() for this.
I suggest we use this at the top of all read() functions in the XMLFoo
files. That way one can easily reuse code for nested data and we get a
uniform error message.
--
Anders
On Wed, Sep 14, 2011 at 11:51:14PM +0200, Anders Logg wrote:
> I need some advice on how to implement the XML parsing for
> MeshDomains. I have this:
>
> <mesh>
> <domains dim="3">
> <mesh_value_collection type="uint" dim="0" />
> stuff
> </mesh_value_collection>
> <mesh_value_collection type="uint" dim="1" />
> stuff
> </mesh_value_collection>
> <mesh_value_collection type="uint" dim="2" />
> stuff
> </mesh_value_collection>
> </domains>
> </mesh>
>
> The parsing of MeshValueCollection is implemented in
> XMLMeshValueCollection.cpp and I want to reuse that inside
> XMLMesh.cpp.
>
> So I've tried something like this:
>
> // Check if we have any domains
> const pugi::xml_node xml_domains = mesh_node.child("domains");
> if (!xml_domains)
> return;
>
> // Iterate over data
> for (pugi::xml_node_iterator it = xml_domains.begin();
> it != xml_domains.end(); ++it)
> {
> // Check that node is <mesh_value_collection>
> const std::string node_name = it->name();
> if (node_name != "mesh_value_collection")
> error("Expecting XML node <mesh_value_collection> but got
> <%s>.",
> node_name.c_str());
>
> // Get attributes
> const std::string type = it->attribute("type").value();
> const uint dim = it->attribute("dim").as_uint();
>
> // Check that the type is uint
> if (type != "uint")
> {
> dolfin_error("XMLMesh.cpp",
> "read DOLFIN mesh from XML file",
> "Mesh domains must be marked as uint, not %s",
> type.c_str());
> }
>
> // Read MeshValueCollection
> XMLMeshValueCollection::read(domains.markers(dim), type, *it);
> }
>
> The problem here is that the node *it sent to XMLMeshValueCollection
> is already the node for the MeshValueCollection but that parser
> expects to get the parent node. But I can't really send it the parent
> node since the parent may have more than one child.
>
> Any ideas?
>
References