AddTopElement (XmlDoc function): Difference between revisions

From m204wiki
Jump to navigation Jump to search
m (insert < for < for self-closed element)
 
(24 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Template:XmlDoc:AddTopElement subtitle}}
{{Template:XmlDoc:AddTopElement subtitle}}
The <var>AddTopElement </var> [[Notation conventions for methods#Callable methods|callable]] function adds an [[XmlDoc API#XmlDoc node types|Element node]] as the new top-level element of the <var>XmlDoc</var> that is the object method.  This makes all the former children of the <var>XmlDoc</var> <var>Root</var> node become children of the new <var>Element</var>. <var>AddTopElement</var> also lets you specify the element namespace URI for the added <var>Element</var>.


This callable function
adds an Element node as the new top-level element of
the <var>XmlDoc</var> that is the object method.
This makes all the former
children of the <var>XmlDoc</var> Root node become children of the new element.
<var>AddTopElement</var> also lets you
specify the element namespace URI for the added element.
==Syntax==
==Syntax==
{{Template:XmlDoc:AddTopElement syntax}}
{{Template:XmlDoc:AddTopElement syntax}}
===Syntax terms===
===Syntax terms===
<table class="syntaxTable">
<table>
<tr><th>%nod</th>
<tr><th>%nod</th>
<td>If specified, an <var>XmlNode</var> that is set to point to the new top Element node that is added. </td></tr>
<td>If specified, an <var>XmlNode</var> that is set to point to the new top <var>Element</var> node that is added.</td></tr>
 
<tr><th>doc</th>
<tr><th>doc</th>
<td>An <var>XmlDoc</var> object variable. </td></tr>
<td>An <var>XmlDoc</var> object variable.</td></tr>
 
<tr><th>name</th>
<tr><th>name</th>
<td>The name (a <var>Unicode</var> string) to be given to the added Element. If the name is prefixed, a <var class="term">uri</var> argument must be provided.
<td>The name (a <var>Unicode</var> string) to be given to the added <var>Element</var>. If the name is prefixed, a <var class="term">uri</var> argument must be provided.
<p>
The name must conform to the XML syntax rules for an element name; the maximum length of each of the prefix part and local name part is 300 characters (127 characters prior to version 7.9, and 100 characters prior to version 7.7). </p></td></tr>


The name must conform to the XML syntax rules for an element name; the maximum length of each of the prefix part and local name part is 127 characters (100 characters prior to version 7.7 of [[Janus SOAP]]). </td></tr>
<tr><th>uri</th>
<tr><th>uri</th>
<td>This optional, <var>Unicode</var> string, argument defaults to the null string: <ul> <li>If <var class="term">name</var> contains a prefix, then <var class="term">uri</var> specifies the URI (Uniform Resource Identifier) associated with that prefix for the element, so it must be a non-null string that is a valid URI. <li>If <var class="term">name</var> does not contain a prefix, then the old top element of the XmlDoc must be in a non-null default namespace, e.g., of the form <code><nowiki><nameWithoutPrefix xmlns="</nowiki><var class="term">uri</var>"></code>.
<td>This optional, <var>Unicode</var> string, argument defaults to the null string:
(Note: prior to version 7.9, <var class="term">uri</var> must be omitted or must be the null string in this case.)</ul> </td></tr>
<ul>
<tr><th>MoveNamespace</th>
<li>If <var class="term">name</var> contains a prefix, then <var class="term">uri</var> specifies the URI (Uniform Resource Identifier) associated with that prefix for the element, so it must be a non-null string that is a valid URI. </li>
<td>This optional, name required argument is used to avoid a redundant namespace declaration on the old top element of the <var>XmlDoc</var>. If <code>MoveNamespace=True</code> and a <var class="term">uri</var> argument (with a non-null string) is provided, then if the "old" top element contains a namespace declaration which is the same as the declaration inserted due to the <var class="term">uri</var> argument, the declaration is deleted from the old top element.


Note: You should use <code>MoveNamespace=True</code> only when some consumer of the XML document cares about not having the redundant declaration. This would be an unusual situation, because the information content of the document does not change. Using <code>MoveNamespace=True</code> might trigger a scan of the entire <var>XmlDoc</var>, which <var>AddTopElement</var> does not normally do.</td></tr>
<li>If <var class="term">name</var> does not contain a prefix, then the old top element of the <var>XmlDoc</var> must be in a non-null default namespace, for example, of the form <code><nowiki><nameWithoutPrefix xmlns="</nowiki><var class="term">uri</var>"></code>.
<p class="note"><b>Note:</b> prior to version 7.9, <var class="term">uri</var> must be omitted or must be the null string if <var class="term">name</var> does not contain a prefix. </p></li>
</ul></td></tr>


<tr><th><var>MoveNamespace</var></th>
<td>This optional, [[Methods#Named parameters|name required]] argument is used to avoid a redundant namespace declaration on the old top element of the <var>XmlDoc</var>. If <code>MoveNamespace=True</code> and a <var class="term">uri</var> argument (with a non-null string) is provided, then if the "old" top element contains a namespace declaration which is the same as the declaration inserted due to the <var class="term">uri</var> argument, the declaration is deleted from the old top element.
<p class="note">'''Note:''' You should use <code>MoveNamespace=True</code> only when some consumer of the XML document cares about not having the redundant declaration. This would be an unusual situation, because the information content of the document does not change. Using <code>MoveNamespace=True</code> might trigger a scan of the entire <var>XmlDoc</var>, which <var>AddTopElement</var> does not normally do.</p>
<p>
<var>MoveNamespace</var> is available as of <var class="product">Sirius Mods</var> version 7.8. </p></td></tr>
</table>
</table>


==Usage notes==
==Usage notes==
<ul>
<ul>
<li>If a <i>URI</i> argument is specified, the <var>XmlDoc</var>'s Namespace property
<li>If a <var class="term">uri</var> argument is specified, the <var>XmlDoc</var>'s <var>[[Namespace (XmlDoc property)|Namespace]]</var> property value must be <var>On</var>.</li>
must be <tt>On</tt>.
 
<li>When you need to change the structure of an XML document and
<li>When you need to change the structure of an XML document and that need can be accomplished with <var>AddTopElement</var>, it is a more efficient approach than using <var>[[AddSubtree_(XmlDoc/XmlNode_function)|AddSubtree]]</var>. See the [[#Examples|example]] below. </li>
that need can be accomplished with <var>AddTopElement</var>, it is a
more efficient approach than using AddSubtree.
See the example in "Examples," below.
</ul>
</ul>
==Examples==
==Examples==
===Add prefixed SOAP wrappers===
The following request makes a copy of an XML document, then adds "SOAP wrappers" to it:
<p class="code">begin
  %doc is object xmlDoc
  %doc2 is object xmlDoc
  %doc = new


The following request makes
  %doc:[[LoadXml_(XmlDoc/XmlNode_function)|loadXml]]('<top><a>&lt;b/></a></top>')
a copy of an XML document, then adds "SOAP
  [[Notation conventions for methods#Callable methods|Call]] %doc:print
wrappers" to it:
  <nowiki>print '*********************'</nowiki>
<p class="code">Begin
%doc is Object XmlDoc
%doc2 is Object XmlDoc
%doc = New
 
%doc:LoadXml('<top><a><b></b></a></top>')
Call %doc:Print
Print '*********************'


%doc2 = %doc:DeepCopy
  %doc2 = %doc:[[DeepCopy_(XmlDoc_function)|DeepCopy]]
%doc2:AddTopElement('soap:Body', -
  <nowiki>%doc2:addTopElement('soap:Body', 'http://schemas.xmlsoap.org/soap/envelope/')  
  'http://schemas.xmlsoap.org/soap/envelope/')
  %doc2:addTopElement('soap:Envelope', 'http://schemas.xmlsoap.org/soap/envelope/')</nowiki>
%doc2:AddTopElement('soap:Envelope', -
  'http://schemas.xmlsoap.org/soap/envelope/')


Call %doc2:Print
  call %doc2:print
End
end
</p>
</p>


The result (with new top element lines wrapped due to space limitations) is:
The result is:
<p class="output"><nowiki><top>
<p class="output"><nowiki><top>
   <a>
   <a>
       <b/>
       &lt;b/>
   </a>
   </a>
</top>
</top>
Line 74: Line 72:
       <top>
       <top>
         <a>
         <a>
             <b/>
             &lt;b/>
         </a>
         </a>
       </top>
       </top>
Line 83: Line 81:
In the example:
In the example:
<ul>
<ul>
<li>The order of the <var>AddTopElement</var> invocations is the
<li>The order of the <var>AddTopElement</var> invocations is the reverse of the final order of the elements, that is, the second invocation creates the first element in the final document.
reverse of the final order of the elements, that is, the second
 
invocation creates the first element in the final document.
<li>If you have no need to preserve the original <var>XmlDoc</var>, then both <var>AddTopElement</var> invocations can use <code>%doc</code> as the object method, and the <var>[[DeepCopy_(XmlDoc_function)|DeepCopy]]</var> can be omitted.
<li>If you have no need to preserve the original
 
<var>XmlDoc</var>, then both <var>AddTopElement</var> invocations
<li>The redundant namespace declaration on the <code>soap:Body</code> element above would be deleted if the <code>MoveNamespace=True</code> argument is used, although usually the redundant declaration is acceptable and <var>MoveNamespace</var> should be avoided.
can use <tt>%doc</tt> as the object method, and the DeepCopy can be omitted.
<li>The redundant
namespace declaration on the <tt>soap&colon.Body</tt> element above would be
deleted if the MoveNamespace=True argument is used, although usually the
redundant declaration is acceptable and MoveNamespace should be avoided.
</ul>
</ul>
===Request-Cancellation Errors===
 
===Add unprefixed SOAP wrappers===
The following example is similar, except that the SOAP elements use a default namespace declaration.  <var>AddTopElement</var> only allows this when the old top element is in a default namespace (here <code>http:mydata</code>).  Note that this example requires <var class="product">Sirius Mods</var> Version 7.9 or greater.
<p class="code">begin
  %doc is object xmlDoc
  %doc2 is object xmlDoc
  %doc = new
 
  %doc:loadXml('<top xmlns="http:mydata"><a>&lt;b/></a></top>')
  call %doc:print
  <nowiki>print '*********************'</nowiki>
 
  <nowiki>%doc2 = %doc:deepCopy
  %doc2:addTopElement('Body', 'http://schemas.xmlsoap.org/soap/envelope/')
  %doc2:addTopElement('Envelope', 'http://schemas.xmlsoap.org/soap/envelope/')</nowiki>     
 
  call %doc2:print
end
</p>
 
The result is:
<p class="output"><nowiki><top xmlns="http:mydata">                                   
  <a>                                                     
      &lt;b/>                                                 
  </a>                                                     
</top>                                                     
*********************                                       
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
  <Body xmlns="http://schemas.xmlsoap.org/soap/envelope/"> 
      <top xmlns="http:mydata">                             
        <a>                                               
            &lt;b/>                                           
        </a>                                               
      </top>                                               
  </Body>                                                 
</Envelope>
</nowiki></p>
 
==Request-cancellation errors==
<ul>
<ul>
<li>Argument <i>elementName</i> violates the rules for an
<li>The <var class="term">name</var> argument violates the rules for an XML element name. </li>
XML element name.
 
<li><i>elementName</i> is prefixed, but the <var>XmlDoc</var>
<li><var class="term">name</var> is prefixed, but the <var>XmlDoc</var> <var>[[Namespace (XmlDoc property)|Namespace]]</var> property value is <var>None</var>. </li>
Namespace property is <tt>None</tt>.
 
<li><i>elementName</i> is prefixed and Namespace
<li><var class="term">name</var> is prefixed and <var>Namespace</var> is <var>On</var>, but <var class="term">uri</var> is missing. </li>
is <tt>On</tt>, but URI is missing.
<li><i>URI</i> is invalid.
<li>The <var class="term">uri</var> argument is invalid. </li>
<li><i>URI</i> is present, but the
 
Namespace property is not <tt>On</tt>,
<li><var class="term">uri</var> is present, but the <var>Namespace</var> property value is not <var>On</var>, or, <var class="term">uri</var> is the null string and <var class="term">name</var> is prefixed. </li>
or, <i>URI</i> is the null string and <i>elementName</i> is prefixed.
 
<li>Insufficient free space exists in CCATEMP.
<li>Insufficient free space exists in CCATEMP. </li>
</ul>
</ul>


==See also==
==See also==
{{Template:XmlDoc:AddTopElement footer}}
<ul>
<li>For more information about namespace declarations, see [[XML processing in Janus SOAP#Names and namespaces|Names and namespaces]]. </li>
 
<li>For more information about URIs, see [[XML processing in Janus SOAP#Uniform Resource Identifier syntax|Uniform Resource Identifier syntax]]. </li>
 
<li><var>[[AddElement (XmlDoc/XmlNode function)|AddElement]]</var> and <var>[[InsertElementBefore (XmlNode function)|InsertElementBefore]]</var> also add an <var>Element</var> node.  <var>AddElement</var> adds an <var>Element</var> as the last child of the node pointed to by the method object; <var>InsertElementBefore</var> adds an <var>Element</var> as the immediately preceding sibling of the node pointed to by the method object. </li>
 
<li>The <var>[[DeleteTopElement (XmlDoc subroutine)|DeleteTopElement]]</var> subroutine removes the top <var>Element</var> from an <var>XmlDoc</var>. </li>


<li>These methods are useful for working with namespaces:
<ul>
<ul>
<li>For more information about
<li><var>[[AddNamespace (XmlNode subroutine)|AddNamespace]]</var> </li>
namespace declarations, see [[??]] refid=namsp..
<li><var>[[SelectionNamespace (XmlDoc property)|SelectionNamespace]]</var> </li>
<li>For more information about URIs, see [[??]] refid=nsuri..
</ul></li>
<li>[[AddElement (XmlDoc/XmlNode function)|AddElement]] and
[[InsertElementBefore (XmlNode function)|InsertElementBefore]] also add an Element node.
AddElement adds an Element as the last child of the node pointed to by the
method object;
InsertElementBefore adds an Element as the immediately preceding
sibling of the node pointed to by the method object.
<li>These methods are useful for working with namespaces:
<ul>
<li>[[AddNamespace (XmlNode subroutine)|AddNamespace]]
<li>[[SelectionNamespace (XmlDoc property)|SelectionNamespace]]
</ul>
</ul>
</ul>
{{Template:XmlDoc:AddTopElement footer}}

Latest revision as of 20:58, 8 August 2018

Add new top element to XmlDoc (XmlDoc class)

[Introduced in Sirius Mods 7.7; requires Janus SOAP]

The AddTopElement callable function adds an Element node as the new top-level element of the XmlDoc that is the object method. This makes all the former children of the XmlDoc Root node become children of the new Element. AddTopElement also lets you specify the element namespace URI for the added Element.

Syntax

[%nod =] doc:AddTopElement( name, [uri], [MoveNamespace= boolean])

Syntax terms

%nod If specified, an XmlNode that is set to point to the new top Element node that is added.
doc An XmlDoc object variable.
name The name (a Unicode string) to be given to the added Element. If the name is prefixed, a uri argument must be provided.

The name must conform to the XML syntax rules for an element name; the maximum length of each of the prefix part and local name part is 300 characters (127 characters prior to version 7.9, and 100 characters prior to version 7.7).

uri This optional, Unicode string, argument defaults to the null string:
  • If name contains a prefix, then uri specifies the URI (Uniform Resource Identifier) associated with that prefix for the element, so it must be a non-null string that is a valid URI.
  • If name does not contain a prefix, then the old top element of the XmlDoc must be in a non-null default namespace, for example, of the form <nameWithoutPrefix xmlns="uri">.

    Note: prior to version 7.9, uri must be omitted or must be the null string if name does not contain a prefix.

MoveNamespace This optional, name required argument is used to avoid a redundant namespace declaration on the old top element of the XmlDoc. If MoveNamespace=True and a uri argument (with a non-null string) is provided, then if the "old" top element contains a namespace declaration which is the same as the declaration inserted due to the uri argument, the declaration is deleted from the old top element.

Note: You should use MoveNamespace=True only when some consumer of the XML document cares about not having the redundant declaration. This would be an unusual situation, because the information content of the document does not change. Using MoveNamespace=True might trigger a scan of the entire XmlDoc, which AddTopElement does not normally do.

MoveNamespace is available as of Sirius Mods version 7.8.

Usage notes

  • If a uri argument is specified, the XmlDoc's Namespace property value must be On.
  • When you need to change the structure of an XML document and that need can be accomplished with AddTopElement, it is a more efficient approach than using AddSubtree. See the example below.

Examples

Add prefixed SOAP wrappers

The following request makes a copy of an XML document, then adds "SOAP wrappers" to it:

begin %doc is object xmlDoc %doc2 is object xmlDoc %doc = new %doc:loadXml('<top><a><b/></a></top>') Call %doc:print print '*********************' %doc2 = %doc:DeepCopy %doc2:addTopElement('soap:Body', 'http://schemas.xmlsoap.org/soap/envelope/') %doc2:addTopElement('soap:Envelope', 'http://schemas.xmlsoap.org/soap/envelope/') call %doc2:print end

The result is:

<top> <a> <b/> </a> </top> ********************* <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <top> <a> <b/> </a> </top> </soap:Body> </soap:Envelope>

In the example:

  • The order of the AddTopElement invocations is the reverse of the final order of the elements, that is, the second invocation creates the first element in the final document.
  • If you have no need to preserve the original XmlDoc, then both AddTopElement invocations can use %doc as the object method, and the DeepCopy can be omitted.
  • The redundant namespace declaration on the soap:Body element above would be deleted if the MoveNamespace=True argument is used, although usually the redundant declaration is acceptable and MoveNamespace should be avoided.

Add unprefixed SOAP wrappers

The following example is similar, except that the SOAP elements use a default namespace declaration. AddTopElement only allows this when the old top element is in a default namespace (here http:mydata). Note that this example requires Sirius Mods Version 7.9 or greater.

begin %doc is object xmlDoc %doc2 is object xmlDoc %doc = new %doc:loadXml('<top xmlns="http:mydata"><a><b/></a></top>') call %doc:print print '*********************' %doc2 = %doc:deepCopy %doc2:addTopElement('Body', 'http://schemas.xmlsoap.org/soap/envelope/') %doc2:addTopElement('Envelope', 'http://schemas.xmlsoap.org/soap/envelope/') call %doc2:print end

The result is:

<top xmlns="http:mydata"> <a> <b/> </a> </top> ********************* <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <Body xmlns="http://schemas.xmlsoap.org/soap/envelope/"> <top xmlns="http:mydata"> <a> <b/> </a> </top> </Body> </Envelope>

Request-cancellation errors

  • The name argument violates the rules for an XML element name.
  • name is prefixed, but the XmlDoc Namespace property value is None.
  • name is prefixed and Namespace is On, but uri is missing.
  • The uri argument is invalid.
  • uri is present, but the Namespace property value is not On, or, uri is the null string and name is prefixed.
  • Insufficient free space exists in CCATEMP.

See also