[fpc-pascal] DOM and namespaces with prefix

Daniel Gaspary dgaspary at gmail.com
Fri Jun 22 02:46:09 CEST 2012


I have created a bug report[1] with an example of malformed file.

[1] http://bugs.freepascal.org/view.php?id=22299

On Thu, Jun 21, 2012 at 3:51 PM, Daniel Gaspary <dgaspary at gmail.com> wrote:
> On Tue, Jun 19, 2012 at 10:11 AM, Torsten Bonde Christiansen
> <tc at epidata.info> wrote:
>> How can i get the "xmlns:a="ddi:archive:3_0" without the additional
>> attribute AND maintain the namespace + prefix in later elements?
>
> Hi.
>
> It's hard to test without a (small please) comlete XML example because
> the NS attribute is added when it's needed. So, you need to add an
> attribute or a child element that uses the Namespace.
>
> The XML below is created with the modfied program ahead. But I believe
> a method to create a namespace attribute would be useful.
>
>
> <?xml version="1.0" encoding="utf-8"?>
> <ns1:DDIInstance xmlns:ns1="ddi:instance:3_0">
>  <a:AnAELement xmlns:a="ddi:archive:3_0">
>    <a:AnotherAELement a:MyAtt="A value"/>
>  </a:AnAELement>
> </ns1:DDIInstance>
>
>
>
> program project1;
> {$mode objfpc}{$H+}
>
> uses
>  Classes, DOM, XMLWrite;
>
> const
>     cArchive = 'ddi:archive:3_0';
> var
>  XMLDoc: TXMLDocument;
>  DDIInstance: TDOMElement;
>  AnAElement, AnotherAElement: TDOMElement;
>
> begin
>  XMLDoc := TXMLDocument.Create;
>  DDIInstance := XMLDoc.CreateElementNS('ddi:instance:3_0', 'DDIInstance');
>  DDIInstance.Prefix := 'ns1';        // this gives me:
> <ns1:DDIInstance xmlns:ns1="ddi:instance:3_0"> which is great.
>
>  //Here a New element using the Namespace that will be created.
>  AnAElement:=XMLDoc.CreateElementNS(cArchive, 'a:AnAELement');
>  DDIInstance.AppendChild(AnAElement);
>
>  //Another element of the same namespace, child of the prior, no
> Namespace creation
>  //needed
>  AnotherAElement:=XMLDoc.CreateElementNS(cArchive, 'a:AnotherAELement');
>  AnAElement.AppendChild(AnotherAElement);
>
>  //The same as above, but with an Attribute
>  AnotherAElement.SetAttributeNS(cArchive, 'a:MyAtt', 'A value');
>
>  Xmldoc.AppendChild(DDIInstance);
>
>  WriteXMLFile(XMLDOc, '/tmp/test.xml');
> end.



More information about the fpc-pascal mailing list