XML: Add a function xmlSetAttributes which can set attrs of a node or of a set of... 08/5408/3
Calixte DENIZET [Tue, 15 Nov 2011 17:51:45 +0000 (18:51 +0100)]
+ Sylvestre => new unitary tests  + updates

Change-Id: I63ae0134e9906fc3027616741fc1534ca1ec44bf

24 files changed:
scilab/modules/xml/Makefile.am
scilab/modules/xml/Makefile.in
scilab/modules/xml/help/en_US/xmlSetAttributes.xml [new file with mode: 0644]
scilab/modules/xml/includes/gw_xml.h
scilab/modules/xml/sci_gateway/c/gw_xml.c
scilab/modules/xml/sci_gateway/cpp/sci_xmlSetAttributes.cpp [new file with mode: 0644]
scilab/modules/xml/sci_gateway/xml_gateway.xml
scilab/modules/xml/src/cpp/XMLAttr.cpp
scilab/modules/xml/src/cpp/XMLAttr.hxx
scilab/modules/xml/src/cpp/XMLElement.cpp
scilab/modules/xml/src/cpp/XMLElement.hxx
scilab/modules/xml/src/cpp/XMLNodeList.cpp
scilab/modules/xml/src/cpp/XMLNodeList.hxx
scilab/modules/xml/src/cpp/XMLNodeSet.cpp
scilab/modules/xml/src/cpp/XMLNodeSet.hxx
scilab/modules/xml/src/cpp/XMLObject.hxx
scilab/modules/xml/tests/unit_tests/xmlDocument.dia.ref
scilab/modules/xml/tests/unit_tests/xmlDocument.tst
scilab/modules/xml/tests/unit_tests/xmlRead.dia.ref
scilab/modules/xml/tests/unit_tests/xmlRead.tst
scilab/modules/xml/tests/unit_tests/xmlSetAttributes.dia.ref [new file with mode: 0644]
scilab/modules/xml/tests/unit_tests/xmlSetAttributes.tst [new file with mode: 0644]
scilab/modules/xml/xml.vcxproj
scilab/modules/xml/xml.vcxproj.filters

index 7d33170..d533b27 100644 (file)
@@ -79,7 +79,8 @@ GATEWAY_CPP_SOURCES = sci_gateway/cpp/sci_xmlRead.cpp \
                      sci_gateway/cpp/sci_xmlIsValidObject.cpp \
                      sci_gateway/cpp/sci_xmlAsNumber.cpp \
                      sci_gateway/cpp/sci_xmlAsText.cpp \
-                     sci_gateway/cpp/sci_xmlRemove.cpp
+                     sci_gateway/cpp/sci_xmlRemove.cpp \
+                     sci_gateway/cpp/sci_xmlSetAttributes.cpp
 
 libscixml_la_CFLAGS= -I$(srcdir)/includes/ \
                     -I$(top_srcdir)/libs/MALLOC/includes/ \
index 89fbb53..e3f5093 100644 (file)
@@ -159,7 +159,8 @@ am__objects_5 = libscixml_la-sci_xmlRead.lo \
        libscixml_la-sci_xmlValidate.lo \
        libscixml_la-sci_xmlIsValidObject.lo \
        libscixml_la-sci_xmlAsNumber.lo libscixml_la-sci_xmlAsText.lo \
-       libscixml_la-sci_xmlRemove.lo
+       libscixml_la-sci_xmlRemove.lo \
+       libscixml_la-sci_xmlSetAttributes.lo
 am_libscixml_la_OBJECTS = $(am__objects_4) $(am__objects_5)
 libscixml_la_OBJECTS = $(am_libscixml_la_OBJECTS)
 libscixml_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \
@@ -568,7 +569,8 @@ GATEWAY_CPP_SOURCES = sci_gateway/cpp/sci_xmlRead.cpp \
                      sci_gateway/cpp/sci_xmlIsValidObject.cpp \
                      sci_gateway/cpp/sci_xmlAsNumber.cpp \
                      sci_gateway/cpp/sci_xmlAsText.cpp \
-                     sci_gateway/cpp/sci_xmlRemove.cpp
+                     sci_gateway/cpp/sci_xmlRemove.cpp \
+                     sci_gateway/cpp/sci_xmlSetAttributes.cpp
 
 libscixml_la_CFLAGS = -I$(srcdir)/includes/ \
                     -I$(top_srcdir)/libs/MALLOC/includes/ \
@@ -736,6 +738,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlRead.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlReadStr.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlRemove.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlSetAttributes.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlValidate.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlValidationFile.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscixml_la-sci_xmlWrite.Plo@am__quote@
@@ -1126,6 +1129,13 @@ libscixml_la-sci_xmlRemove.lo: sci_gateway/cpp/sci_xmlRemove.cpp
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlRemove.lo `test -f 'sci_gateway/cpp/sci_xmlRemove.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlRemove.cpp
 
+libscixml_la-sci_xmlSetAttributes.lo: sci_gateway/cpp/sci_xmlSetAttributes.cpp
+@am__fastdepCXX_TRUE@  $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT libscixml_la-sci_xmlSetAttributes.lo -MD -MP -MF $(DEPDIR)/libscixml_la-sci_xmlSetAttributes.Tpo -c -o libscixml_la-sci_xmlSetAttributes.lo `test -f 'sci_gateway/cpp/sci_xmlSetAttributes.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlSetAttributes.cpp
+@am__fastdepCXX_TRUE@  $(am__mv) $(DEPDIR)/libscixml_la-sci_xmlSetAttributes.Tpo $(DEPDIR)/libscixml_la-sci_xmlSetAttributes.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     source='sci_gateway/cpp/sci_xmlSetAttributes.cpp' object='libscixml_la-sci_xmlSetAttributes.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(LIBTOOL)  --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libscixml_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o libscixml_la-sci_xmlSetAttributes.lo `test -f 'sci_gateway/cpp/sci_xmlSetAttributes.cpp' || echo '$(srcdir)/'`sci_gateway/cpp/sci_xmlSetAttributes.cpp
+
 mostlyclean-libtool:
        -rm -f *.lo
 
diff --git a/scilab/modules/xml/help/en_US/xmlSetAttributes.xml b/scilab/modules/xml/help/en_US/xmlSetAttributes.xml
new file mode 100644 (file)
index 0000000..e1e74ed
--- /dev/null
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+* Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+* Copyright (C) 2011 - DIGITEO - Calixte DENIZET
+*
+* This file must be used under the terms of the CeCILL.
+* This source file is licensed as described in the file COPYING, which
+* you should have received as part of this distribution.  The terms
+* are also available at
+* http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+-->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" version="5.0-subset Scilab" xml:id="xmlSetAttributes" xml:lang="en">
+  <info>
+    <pubdate>$LastChangedDate$</pubdate>
+  </info>
+  <refnamediv>
+    <refname>xmlSetAttributes</refname>
+    <refpurpose>Set the attributes name and value.</refpurpose>
+  </refnamediv>
+  <refsynopsisdiv>
+    <title>Calling Sequence</title>
+    <synopsis>
+      xmlObj = xmlSetAttributes(xmlObj, nameValue)
+    </synopsis>
+  </refsynopsisdiv>
+  <refsection>
+    <title>Arguments</title>
+    <variablelist>
+      <varlistentry>
+        <term>xmlObj</term>
+        <listitem>
+          <para>xmlObj, a XML mlist typed XMLSet or XMLList or XMLElem or XMLAttr</para>
+        </listitem>
+      </varlistentry>
+      <varlistentry>
+        <term>nameValue</term>
+        <listitem>
+          <para>nameValue, a matrix nx2 or nx3 of strings where each rows contains [name value] or [prefix name value]</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsection>
+  <refsection>
+    <title>Description</title>
+    <para>Set the attributes of an element or a list of elements.</para>
+  </refsection>
+  <refsection>
+    <title>Examples</title>
+    <programlisting role="example"><![CDATA[
+    doc = xmlReadStr("<root><a><b><c></c></b></a><b></b></root>");
+
+    // Retrieve all the nodes
+    xp = xmlXPath(doc, "//*");
+
+    // Add the attributes hello="world" and bonjour="monde" to all the nodes
+    xmlSetAttributes(xp, ["hello" "world" ; "bonjour" "monde"]);
+    xmlDump(doc)
+
+    // Add the attribute foo="bar" to the first child of root
+    xmlSetAttributes(doc.root.children(1), ["foo" "bar"]);
+    xmlDump(doc)
+
+    // Add the attribute bar="foo" to all the children of root
+    xmlSetAttributes(doc.root.children, ["bar" "foo"]);
+
+    // Add the attribute truc="machin" to the list of the attributes of the second <b>
+    xmlSetAttributes(doc.root.children(2).attributes, ["truc" "machin"]);
+    xmlDump(doc)
+
+    xmlClose(doc);
+    ]]></programlisting>
+  </refsection>
+  <refsection role="see also">
+    <title>See Also</title>
+    <simplelist type="inline">
+      <member>
+        <link linkend="XMLObjects">XMLObjects</link>
+      </member>
+    </simplelist>
+  </refsection>
+  <refsection>
+    <title>Author</title>
+    <para>Calixte DENIZET</para>
+  </refsection>
+  <refsection>
+    <title>History</title>
+    <revhistory>
+      <revision>
+        <revnumber>5.4.0</revnumber>
+        <revremark>XML module introduced.</revremark>
+      </revision>
+    </revhistory>
+  </refsection>
+</refentry>
index 3b26a5a..19baa71 100644 (file)
@@ -70,6 +70,7 @@ int sci_xmlIsValidObject(char *fname, unsigned long fname_len);
 int sci_xmlAsNumber(char *fname, unsigned long fname_len);
 int sci_xmlAsText(char *fname, unsigned long fname_len);
 int sci_xmlRemove(char *fname, unsigned long fname_len);
+int sci_xmlSetAttributes(char *fname, unsigned long fname_len);
 /*--------------------------------------------------------------------------*/
 #endif /* __GW_XML_H__ */
 /*--------------------------------------------------------------------------*/
index 40aa7a1..f493f46 100644 (file)
@@ -96,7 +96,8 @@ static gw_generic_table Tab[] =
     {sci_xmlIsValidObject, "xmlIsValidObject"},
     {sci_xmlAsNumber, "xmlAsNumber"},
     {sci_xmlAsText, "xmlAsText"},
-    {sci_xmlRemove, "xmlRemove"}
+    {sci_xmlRemove, "xmlRemove"},
+    {sci_xmlSetAttributes, "xmlSetAttributes"}
 };
 /*--------------------------------------------------------------------------*/
 int gw_xml(void)
diff --git a/scilab/modules/xml/sci_gateway/cpp/sci_xmlSetAttributes.cpp b/scilab/modules/xml/sci_gateway/cpp/sci_xmlSetAttributes.cpp
new file mode 100644 (file)
index 0000000..600bc57
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2009 - DIGITEO - Antoine ELIAS
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+
+extern "C"
+{
+#include "xml.h"
+#include "gw_xml.h"
+#include "stack-c.h"
+#include "Scierror.h"
+#include "api_scilab.h"
+#include "xml_mlist.h"
+#include "localization.h"
+}
+
+#include "XMLObject.hxx"
+
+using namespace org_modules_xml;
+
+/*--------------------------------------------------------------------------*/
+int sci_xmlSetAttributes(char * fname, unsigned long fname_len)
+{
+    int id;
+    SciErr err;
+    int * addr = 0;
+    XMLObject * obj = 0;
+    char ** keyValue = 0;
+    int rows;
+    int cols;
+
+    CheckLhs(1, 1);
+    CheckRhs(2, 2);
+
+    err = getVarAddressFromPosition(pvApiCtx, 1, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isXMLAttr(addr, pvApiCtx) && !isXMLElem(addr, pvApiCtx) && !isXMLList(addr, pvApiCtx) && !isXMLSet(addr, pvApiCtx))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%d: A XMLAttr or a XMLElem or a XMLList or a XMLSet expected.\n"), fname, 1);
+        return 0;
+    }
+
+    id = getXMLObjectId(addr, pvApiCtx);
+    obj = XMLObject::getFromId<XMLObject>(id);
+    if (!obj)
+    {
+        Scierror(999, gettext("%s: XML attributes does not exist.\n"), fname);
+        return 0;
+    }
+
+    err = getVarAddressFromPosition(pvApiCtx, 2, &addr);
+    if (err.iErr)
+    {
+        printError(&err, 0);
+        return 0;
+    }
+
+    if (!isStringType(pvApiCtx, addr))
+    {
+        Scierror(999, gettext("%s: Wrong type for input argument #%d: Matrix of strings expected.\n"), fname, 2);
+        return 0;
+    }
+
+    if (getAllocatedMatrixOfString(pvApiCtx, addr, &rows, &cols, &keyValue))
+    {
+        return 0;
+    }
+
+    if (rows == 0 || (cols != 2 && cols != 3))
+    {
+        freeAllocatedMatrixOfString(rows, cols, keyValue);
+        Scierror(999, gettext("%s: Wrong size for input argument #%d: Matrix nx2 or nx3 of strings expected.\n"), fname, 2);
+        return 0;
+    }
+
+    if (cols == 2)
+    {
+        obj->setAttributeValue(const_cast<const char **>(keyValue), const_cast<const char **>(keyValue + rows), rows);
+    }
+    else
+    {
+        obj->setAttributeValue(const_cast<const char **>(keyValue), const_cast<const char **>(keyValue + rows), const_cast<const char **>(keyValue + 2 * rows), rows);
+    }
+    freeAllocatedMatrixOfString(rows, cols, keyValue);
+
+    obj->createOnStack(Rhs + 1, pvApiCtx);
+    LhsVar(1) = Rhs + 1;
+    PutLhsVar();
+
+    return 0;
+}
index 01cbb67..8237d1e 100644 (file)
 <PRIMITIVE gatewayId="68" primitiveId="75" primitiveName="xmlAsNumber" />
 <PRIMITIVE gatewayId="68" primitiveId="76" primitiveName="xmlAsText" />
 <PRIMITIVE gatewayId="68" primitiveId="77" primitiveName="xmlRemove" />
+<PRIMITIVE gatewayId="68" primitiveId="78" primitiveName="xmlSetAttributes" />
 </GATEWAY>
index 409055f..6f7e6de 100644 (file)
@@ -94,68 +94,127 @@ namespace org_modules_xml
 
     void XMLAttr::setAttributeValue(const char * prefix, const char * name, const char * value) const
     {
-        xmlNode * node = elem.getRealNode();
-        xmlAttr * attrs = 0;
-        for (xmlAttr * cur = node->properties; cur; cur = cur->next)
+        setAttributeValue(elem.getRealNode(), prefix, name, value);
+    }
+
+    void XMLAttr::setAttributeValue(xmlNode * node, const char * prefix, const char * name, const char * value)
+    {
+        if (node && node->type == XML_ELEMENT_NODE)
         {
-            if (cur->ns && !strcmp(name, (const char *)cur->name) && (!strcmp(prefix, (const char *)cur->ns->prefix) || !strcmp(prefix, (const char *)cur->ns->href)))
+            xmlAttr * attrs = 0;
+            for (xmlAttr * cur = node->properties; cur; cur = cur->next)
             {
-                attrs = cur;
-                break;
+                if (cur->ns && !strcmp(name, (const char *)cur->name) && (!strcmp(prefix, (const char *)cur->ns->prefix) || !strcmp(prefix, (const char *)cur->ns->href)))
+                {
+                    attrs = cur;
+                    break;
+                }
             }
-        }
 
-        if (attrs)
-        {
-            xmlSetNsProp(node, attrs->ns, (const xmlChar *)name, (const xmlChar *)value);
-        }
-        else
-        {
-            xmlNs * ns = 0;
-            if (!strncmp(prefix, "http://", strlen("http://")))
+            if (attrs)
             {
-                ns = xmlSearchNsByHref(elem.getXMLDocument().getRealDocument(), node, (const xmlChar *)prefix);
+                xmlSetNsProp(node, attrs->ns, (const xmlChar *)name, (const xmlChar *)value);
             }
             else
             {
-                ns = xmlSearchNs(elem.getXMLDocument().getRealDocument(), node, (const xmlChar *)prefix);
+                xmlNs * ns = 0;
+                if (!strncmp(prefix, "http://", strlen("http://")))
+                {
+                    ns = xmlSearchNsByHref(node->doc, node, (const xmlChar *)prefix);
+                }
+                else
+                {
+                    ns = xmlSearchNs(node->doc, node, (const xmlChar *)prefix);
+                }
+
+                if (ns)
+                {
+                    xmlSetNsProp(node, ns, (const xmlChar *)name, (const xmlChar *)value);
+                }
+                else
+                {
+                    xmlSetProp(node, (const xmlChar *)name, (const xmlChar *)value);
+                }
             }
+        }
+    }
 
-            if (ns)
-            {
-                xmlSetNsProp(node, ns, (const xmlChar *)name, (const xmlChar *)value);
-            }
-            else
+    void XMLAttr::setAttributeValue(xmlNode * node, const char ** prefix, const char ** name, const char ** value, int size)
+    {
+        if (node && node->type == XML_ELEMENT_NODE)
+        {
+            for (int i = 0; i < size; i++)
             {
-                xmlSetProp(node, (const xmlChar *)name, (const xmlChar *)value);
+                setAttributeValue(node, prefix[i], name[i], value[i]);
             }
         }
     }
 
+    void XMLAttr::setAttributeValue(const char ** prefix, const char ** name, const char ** value, int size) const
+    {
+        for (int i = 0; i < size; i++)
+        {
+            setAttributeValue(prefix[i], name[i], value[i]);
+        }
+    }
+
     void XMLAttr::setAttributeValue(int index, const char * value) const
     {
-        xmlNode * node = elem.getRealNode();
-        unsigned int i = 1;
-        for (xmlAttr * cur = node->properties; cur; cur = cur->next, i++)
+        setAttributeValue(elem.getRealNode(), index, value);
+    }
+
+    void XMLAttr::setAttributeValue(xmlNode * node, int index, const char * value)
+    {
+        if (node && node->type == XML_ELEMENT_NODE)
         {
-            if (i == index)
+            int i = 1;
+            for (xmlAttr * cur = node->properties; cur; cur = cur->next, i++)
             {
-               cur->children->content = xmlStrdup((const xmlChar *)value);
+                if (i == index)
+                {
+                    cur->children->content = xmlStrdup((const xmlChar *)value);
+                }
             }
         }
     }
 
     void XMLAttr::setAttributeValue(const char * name, const char * value) const
     {
-        xmlNode * node = elem.getRealNode();
-        xmlAttr * attrs = xmlHasProp(node, (const xmlChar *)name);
-        if (attrs)
+        setAttributeValue(elem.getRealNode(), name, value);
+    }
+
+    void XMLAttr::setAttributeValue(xmlNode * node, const char * name, const char * value)
+    {
+        if (node && node->type == XML_ELEMENT_NODE)
         {
-            xmlSetProp(node, (const xmlChar *)name, (const xmlChar *)value);
+            xmlAttr * attrs = xmlHasProp(node, (const xmlChar *)name);
+            if (attrs)
+            {
+                xmlSetProp(node, (const xmlChar *)name, (const xmlChar *)value);
+            }
+            else
+            {
+                xmlNewProp(node, (const xmlChar *)name, (const xmlChar *)value);
+            }
         }
-        else
+    }
+
+    void XMLAttr::setAttributeValue(xmlNode * node, const char ** name, const char ** value, int size)
+    {
+        if (node && node->type == XML_ELEMENT_NODE)
+        {
+            for (int i = 0; i < size; i++)
+            {
+                setAttributeValue(node, name[i], value[i]);
+            }
+        }
+    }
+
+    void XMLAttr::setAttributeValue(const char ** name, const char ** value, int size) const
+    {
+        for (int i = 0; i < size; i++)
         {
-           xmlNewProp(node, (const xmlChar *)name, (const xmlChar *)value);
+            setAttributeValue(name[i], value[i]);
         }
     }
 
index 9742822..67bba8c 100644 (file)
@@ -74,6 +74,31 @@ namespace org_modules_xml
         void setAttributeValue(const char * name, const char * value) const;
 
         /**
+         * Sets the attribute value.
+         * @param node the node where to set the attributes
+         * @param name the attribute name
+         * @param value the attribute value
+         */
+        static void setAttributeValue(xmlNode * node, const char * name, const char * value);
+
+        /**
+         * Sets the attribute value.
+         * @param name the attribute names
+         * @param value the attribute values
+         * @param size the number of names
+         */
+        void setAttributeValue(const char ** name, const char ** value, int size) const;
+
+        /**
+         * Sets the attribute value.
+         * @param node the node where to set the attributes
+         * @param name the attribute names
+         * @param value the attribute values
+         * @param size the number of names
+         */
+        static void setAttributeValue(xmlNode * node, const char ** name, const char ** value, int size);
+
+        /**
          * Sets the attribute value at the given index.
          * @param index the attribute index
          * @param value the attribute value
@@ -81,6 +106,14 @@ namespace org_modules_xml
         void setAttributeValue(int index, const char * value) const;
 
         /**
+         * Sets the attribute value at the given index.
+         * @param node the node where to set the attributes
+         * @param index the attribute index
+         * @param value the attribute value
+         */
+        static void setAttributeValue(xmlNode * node, int index, const char * value);
+
+        /**
          * Sets the attribute value with a prefix namespace.
          * @param prefix the namespace prefix or the namespace itself
          * @param name the attribute name
@@ -89,6 +122,34 @@ namespace org_modules_xml
         void setAttributeValue(const char * prefix, const char * name, const char * value) const;
 
         /**
+         * Sets the attribute value with a prefix namespace.
+         * @param node the node where to set the attributes
+         * @param prefix the namespace prefix or the namespace itself
+         * @param name the attribute name
+         * @param value the attribute value
+         */
+        static void setAttributeValue(xmlNode * node, const char * prefix, const char * name, const char * value);
+
+        /**
+         * Sets the attribute value with a prefix namespace.
+         * @param prefix the namespace prefix or the namespace itself
+         * @param name the attribute names
+         * @param value the attribute values
+         * @param size the number of names
+         */
+        void setAttributeValue(const char ** prefix, const char ** name, const char ** value, int size) const;
+
+        /**
+         * Sets the attribute value with a prefix namespace.
+         * @param node the node where to set the attributes
+         * @param prefix the namespace prefix or the namespace itself
+         * @param name the attribute names
+         * @param value the attribute values
+         * @param size the number of names
+         */
+        static void setAttributeValue(xmlNode * node, const char ** prefix, const char ** name, const char ** value, int size);
+
+        /**
          * Gets the element associated with this object
          * @return the associated object
          */
index 7b8af0c..8479b3b 100644 (file)
@@ -102,6 +102,16 @@ namespace org_modules_xml
         }
     }
 
+    void XMLElement::setAttributeValue(const char ** prefix, const char ** name, const char ** value, int size) const
+    {
+       XMLAttr::setAttributeValue(node, prefix, name, value, size);
+    }
+
+    void XMLElement::setAttributeValue(const char ** name, const char ** value, int size) const
+    {
+       XMLAttr::setAttributeValue(node, name, value, size);
+    }
+
     void XMLElement::setChildren(const XMLElement & elem) const
     {
         xmlNode * n = elem.getRealNode();
index d3d30fe..560adf6 100644 (file)
@@ -177,6 +177,8 @@ namespace org_modules_xml
          */
         int getDefinitionLine() const;
 
+        void setAttributeValue(const char ** prefix, const char ** name, const char ** value, int size) const;
+        void setAttributeValue(const char ** name, const char ** value, int size) const;
         const XMLObject * getXMLObjectParent() const;
         const std::string dump() const;
         const std::string toString() const;
index 67943cf..2975d82 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "XMLObject.hxx"
 #include "XMLDocument.hxx"
+#include "XMLAttr.hxx"
 #include "XMLElement.hxx"
 #include "XMLNodeList.hxx"
 #include "VariableScope.hxx"
@@ -54,6 +55,22 @@ namespace org_modules_xml
         return list;
     }
 
+    void XMLNodeList::setAttributeValue(const char ** prefix, const char ** name, const char ** value, int lsize) const
+    {
+        for (xmlNode * cur = parent->children; cur; cur = cur->next)
+        {
+            XMLAttr::setAttributeValue(cur, prefix, name, value, lsize);
+        }
+    }
+
+    void XMLNodeList::setAttributeValue(const char ** name, const char ** value, int lsize) const
+    {
+        for (xmlNode * cur = parent->children; cur; cur = cur->next)
+        {
+            XMLAttr::setAttributeValue(cur, name, value, lsize);
+        }
+    }
+
     void XMLNodeList::remove() const
     {
         xmlNode * cur = parent->children;
index 62b5fc4..e429fa8 100644 (file)
@@ -97,6 +97,8 @@ namespace org_modules_xml
          */
         xmlNode * getRealNode() const { return parent->children; }
 
+       void setAttributeValue(const char ** prefix, const char ** name, const char ** value, int lsize) const;
+        void setAttributeValue(const char ** name, const char ** value, int lsize) const;
         const XMLObject * getXMLObjectParent() const;
         const std::string dump() const;
         const XMLObject * getListElement(int index);
index 1d7d40a..85fb99b 100644 (file)
@@ -62,6 +62,22 @@ namespace org_modules_xml
         return list;
     }
 
+    void XMLNodeSet::setAttributeValue(const char ** prefix, const char ** name, const char ** value, int lsize) const
+    {
+       for (int i = 0; i < size; i++)
+        {
+            XMLAttr::setAttributeValue(nodeSet->nodeTab[i], prefix, name, value, lsize);
+        }
+    }
+
+    void XMLNodeSet::setAttributeValue(const char ** name, const char ** value, int lsize) const
+    {
+       for (int i = 0; i < size; i++)
+        {
+            XMLAttr::setAttributeValue(nodeSet->nodeTab[i], name, value, lsize);
+        }
+    }
+
     void XMLNodeSet::remove() const
     {
         for (int i = 0; i < size; i++)
index 5fe3613..20ff765 100644 (file)
@@ -49,7 +49,8 @@ namespace org_modules_xml
         const char ** getContentFromList() const;
 
         void remove() const;
-
+       void setAttributeValue(const char ** prefix, const char ** name, const char ** value, int lsize) const;
+        void setAttributeValue(const char ** name, const char ** value, int lsize) const;
         const XMLObject * getXMLObjectParent() const;
         const XMLObject * getListElement(int index);
     };
index 23fde1d..0b38cab 100644 (file)
@@ -60,6 +60,23 @@ namespace org_modules_xml
          */
         virtual const XMLObject * getXMLObjectParent() const { return 0; }
 
+       /**
+         * Sets the attribute value.
+         * @param name the attribute names
+         * @param value the attribute values
+         * @param size the number of names
+         */
+        virtual void setAttributeValue(const char ** name, const char ** value, int size) const { return; }
+
+       /**
+         * Sets the attribute value with a prefix namespace.
+         * @param prefix the namespace prefix or the namespace itself
+         * @param name the attribute names
+         * @param value the attribute values
+         * @param size the number of names
+         */
+        virtual void setAttributeValue(const char ** prefix, const char ** name, const char ** value, int size) const { return; }
+
         /**
          * @return the string representation of this object
          */
index 91e6fb4..414f095 100644 (file)
@@ -23,5 +23,5 @@ xmlClose(doc);
 doc2 = xmlRead("TMPDIR/foo.xml");
 assert_checkfalse(execstr("doc2.line","errcatch") == 0);
 assert_checkequal(doc2.root.line,2);
-assert_checkequal(doc2.root.children(1).line,2);
+assert_checkequal(doc2.root.children(1).line,3);
 xmlClose(doc2);
index 3b961ed..218eb5a 100644 (file)
@@ -30,5 +30,5 @@ xmlClose(doc);
 doc2 = xmlRead("TMPDIR/foo.xml");
 assert_checkfalse(execstr("doc2.line","errcatch") == 0);
 assert_checkequal(doc2.root.line,2);
-assert_checkequal(doc2.root.children(1).line,2);
+assert_checkequal(doc2.root.children(1).line,3);
 xmlClose(doc2);
index 253b6fe..99da6ce 100644 (file)
@@ -31,11 +31,13 @@ assert_checkequal(xmlFile.root.type,"XML_ELEMENT_NODE");
 elements=xmlFile.root.children;
 assert_checktrue(size(elements)>0);
 for (i=1:length(elements))
-  assert_checktrue(length(xmlFile.root.children(i).attributes)>0);
   if (xmlFile.root.children(i).type<>"XML_COMMENT_NODE")
     assert_checktrue(length(xmlFile.root.children(i).attributes.name)> 0);
     assert_checktrue(xmlFile.root.children(i).attributes.activate=="yes" ...
                    | xmlFile.root.children(i).attributes.activate=="no");
+  else
+// It is a comment, no attributes
+    assert_checkequal(length(xmlFile.root.children(i).attributes),0);
   end
 end
 xmlClose(xmlFile);
index c028944..f20fd7b 100644 (file)
@@ -37,12 +37,13 @@ assert_checkequal(xmlFile.root.type,"XML_ELEMENT_NODE");
 elements=xmlFile.root.children;
 assert_checktrue(size(elements)>0);
 for (i=1:length(elements))
-  assert_checktrue(length(xmlFile.root.children(i).attributes)>0);
   if (xmlFile.root.children(i).type<>"XML_COMMENT_NODE")
     assert_checktrue(length(xmlFile.root.children(i).attributes.name)> 0);
-
     assert_checktrue(xmlFile.root.children(i).attributes.activate=="yes" ...
                    | xmlFile.root.children(i).attributes.activate=="no");
+  else
+// It is a comment, no attributes
+    assert_checkequal(length(xmlFile.root.children(i).attributes),0);
   end
 end
 xmlClose(xmlFile);
diff --git a/scilab/modules/xml/tests/unit_tests/xmlSetAttributes.dia.ref b/scilab/modules/xml/tests/unit_tests/xmlSetAttributes.dia.ref
new file mode 100644 (file)
index 0000000..da51363
--- /dev/null
@@ -0,0 +1,35 @@
+// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,=
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO - Sylvestre LEDRU
+//
+//  This file is distributed under the same license as the Scilab package.
+// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,=
+doc = xmlReadStr("<root><a><b><c></c></b></a><b></b></root>");
+// Retrieve all the nodes
+xp = xmlXPath(doc, "//a");
+// Add the attributes hello="world" and bonjour="monde" to all the nodes
+xmlSetAttributes(xp, ["hello" "world" ; "bonjour" "monde"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde""><b><c></c></b></a><b></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+xp = xmlXPath(doc, "//*/*/c");
+xmlSetAttributes(xp, ["hello" "world" ; "bonjour" "monde"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde""><b><c hello=""world"" bonjour=""monde""></c></b></a><b></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+// Add the attribute foo="bar" to the first child of root
+xmlSetAttributes(doc.root.children(1), ["foo" "bar"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde"" foo=""bar""><b><c hello=""world"" bonjour=""monde""></c></b></a><b></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+// Add the attribute bar="foo" to all the children of root
+xmlSetAttributes(doc.root.children, ["bar" "foo2"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde"" foo=""bar"" bar=""foo2""><b><c hello=""world"" bonjour=""monde""></c></b></a><b bar=""foo2""></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+// Add the attribute truc="machin" to the list of the attributes of the second <b>
+xmlSetAttributes(doc.root.children(2).attributes, ["truc" "machin"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde"" foo=""bar"" bar=""foo2""><b><c hello=""world"" bonjour=""monde""></c></b></a><b bar=""foo2"" truc=""machin""></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+xmlClose(doc);
+xmlClose(doc2);
+doc = xmlReadStr("<root><a><b><c></c></b></a><b></b></root>");
+xp = xmlXPath(doc, "//accc");
+a=xmlSetAttributes(xp, ["hello" "world" ; "bonjour" "monde"]);
+assert_checkequal(length(a),0);
diff --git a/scilab/modules/xml/tests/unit_tests/xmlSetAttributes.tst b/scilab/modules/xml/tests/unit_tests/xmlSetAttributes.tst
new file mode 100644 (file)
index 0000000..2a25b39
--- /dev/null
@@ -0,0 +1,48 @@
+// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,=
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - DIGITEO - Sylvestre LEDRU
+//
+//  This file is distributed under the same license as the Scilab package.
+// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,=
+
+doc = xmlReadStr("<root><a><b><c></c></b></a><b></b></root>");
+
+// Retrieve all the nodes
+xp = xmlXPath(doc, "//a");
+
+// Add the attributes hello="world" and bonjour="monde" to all the nodes
+xmlSetAttributes(xp, ["hello" "world" ; "bonjour" "monde"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde""><b><c></c></b></a><b></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+xp = xmlXPath(doc, "//*/*/c");
+xmlSetAttributes(xp, ["hello" "world" ; "bonjour" "monde"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde""><b><c hello=""world"" bonjour=""monde""></c></b></a><b></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+
+
+// Add the attribute foo="bar" to the first child of root
+xmlSetAttributes(doc.root.children(1), ["foo" "bar"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde"" foo=""bar""><b><c hello=""world"" bonjour=""monde""></c></b></a><b></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+
+
+// Add the attribute bar="foo" to all the children of root
+xmlSetAttributes(doc.root.children, ["bar" "foo2"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde"" foo=""bar"" bar=""foo2""><b><c hello=""world"" bonjour=""monde""></c></b></a><b bar=""foo2""></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+
+// Add the attribute truc="machin" to the list of the attributes of the second <b>
+xmlSetAttributes(doc.root.children(2).attributes, ["truc" "machin"]);
+doc2 = xmlReadStr("<root><a hello=""world"" bonjour=""monde"" foo=""bar"" bar=""foo2""><b><c hello=""world"" bonjour=""monde""></c></b></a><b bar=""foo2"" truc=""machin""></b></root>");
+assert_checkequal(xmlDump(doc),xmlDump(doc2));
+
+xmlClose(doc);
+xmlClose(doc2);
+
+
+doc = xmlReadStr("<root><a><b><c></c></b></a><b></b></root>");
+
+xp = xmlXPath(doc, "//accc");
+
+a=xmlSetAttributes(xp, ["hello" "world" ; "bonjour" "monde"]);
+assert_checkequal(length(a),0);
index 634ead8..fa4c4ed 100644 (file)
     <ClCompile Include="sci_gateway\cpp\sci_xmlRead.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_xmlReadStr.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_xmlRemove.cpp" />
+    <ClCompile Include="sci_gateway\cpp\sci_xmlSetAttributes.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_xmlValidate.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_xmlValidationFile.cpp" />
     <ClCompile Include="sci_gateway\cpp\sci_xmlWrite.cpp" />
index 2a49c00..6e7d656 100644 (file)
     <ClCompile Include="sci_gateway\cpp\sci_xmlRemove.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="sci_gateway\cpp\sci_xmlSetAttributes.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file