RE: [wsrp-interop] Empty value for XMLNS

From
Qichard Kacob
Date
2009-12-09T11:08:17+00:00
ID
Thread
RE: [wsrp-interop] Empty value for XMLNS
In your example the Value for Qname has
no namespace attached.

Attributes do not pick up the default
namespace or the element's namespace.

I recall sending out a W3C discussion
document about that and a recommendation to the list but can't find it
any more. The OASIS search doesn't help me very well here.

Mit freundlichen Grüßen / Kind
regards

 
 
 
 

Richard Jacob

 

Team Lead Portal
Standards & WCM development

WSRP Standardization Lead

IBM Software Group,
WPLC

WSS Websphere Portal
Foundation Development 1

Phone:
+49-7031-16-3469
 IBM Deutschland Research
& Development

E-Mail:

 Schoenaicher Str. 220

 
 
 71032 Boeblingen

 
 
 Germany

IBM Deutschland Research
& Development GmbH / Vorsitzender des Aufsichtsrats: Martin Jetter

Geschäftsführung: Dirk Wittkopp 

Sitz der Gesellschaft: Böblingen / Registergericht: Amtsgericht Stuttgart,
HRB 243294 
 

 

From:
"Nader Oteifa" <>

To:
<>

Date:
12/09/2009 06:39 AM

Subject:
RE: [wsrp-interop] Empty value for XMLNS

I recalled the problem with
XMLNS=”” in .NET.  The problem has to do when use a QName for an
attribute value.

 

Take the following XML:

 

<?xml version="1.0"
encoding="IBM437"?>

   <b1:ComplexType
QName="LocalName"  xmlns:b1="urn:Namespace" xmlns=""
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <b1:Int>10</b1:Int>

    <b1:String>A
description</b1:String>

</b1:ComplexType>

 

What should the namespace
for the QName attribute *value* be?  .NET reports “” for
the namespace when I de-serialize the above XML to a .NET class instance.
 However, when I take the same class instance and serialize it, it
produces the following XML:

 

<?xml version="1.0"
encoding="IBM437"?>

<ComplexType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
QName="LocalName" xmlns="urn:Namespace">

   <Int>10</Int>

   <String>A
description</String>

</ComplexType>

 

When this XML is de-serialized
for the same class, the namespace for the QName value is “urn:Namespace”.
 I’m assuming this is a bug in .NET given that de-serializing, serializing
and then de-serializing once more is producing different results.  I
have not found a way to force .NET to emit XMLNS=”” for a QName attribute
value specifying an “” namespace value.   It would be interesting
to see what Java does.  

 

I’m not totally sure of
all of the interop ramifications because I’m not sure how Java serializes
the above XML and the resulting namespaces.  It also depends on what
the W3C XML namespace rules are for QName attribute values  which
I need to look into further.  

 

Here is the code in C# I
used for those interested in trying the same thing in Java:

 

[XmlRoot(Namespace="urn:Namespace")]

public class ComplexType

{

       
        public  int Int = 10;

       
        public string String = "String Value";

       
        [XmlAttribute]

       
        public XmlQualifiedName QName = new XmlQualifiedName("LocalName",
"");

}

 

class Program

{

       
        static void Main(string[] args)

       
        {

       
                     
  //Build XML and emit to console

       
                     
  System.Text.StringBuilder sb1 = new StringBuilder();

       
                     
  sb1.AppendLine("<?xml version=\"1.0\" encoding=\"IBM437\"?>");

       
                     
  sb1.AppendLine("<b1:ComplexType xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"
QName=\"LocalName\" xmlns:b1=\"urn:Namespace\" xmlns=\"\">");

       
                     
  sb1.AppendLine("    <b1:Int>10</b1:Int>");

       
                     
  sb1.AppendLine("    <b1:String>A description</b1:String>");

       
                     
  sb1.AppendLine("</b1:ComplexType>");

       
                     
  Console.WriteLine(sb1.ToString());

       
                     
                  

       
                     
  //Deserialize and output QName value namespace

       
                     
  XmlSerializer serializer = new XmlSerializer(typeof(ComplexType));

       
                     
  ComplexType complexInstance = serializer.Deserialize(new StringReader(sb1.ToString()))
as ComplexType;

       
                     
  Console.WriteLine();

       
                     
  Console.WriteLine("QName namespace = [" + complexInstance.QName.Namespace
+ "]");  //results in “”

 

       
                     
  //Serialize  to string buffer and emit to console

       
                     
  System.Text.StringBuilder sb2 = new StringBuilder();

       
                     
  System.IO.StringWriter writer = new StringWriter(sb2);

       
                     
  serializer.Serialize(writer, complexInstance);

       
                     
  Console.WriteLine();

       
                     
  Console.WriteLine();

       
                     
  serializer.Serialize(Console.Out, complexInstance);

 

       
                     
  //Deserialize and output QName value namespace once more

       
                     
  complexInstance = serializer.Deserialize(new StringReader(sb2.ToString()))
as ComplexType;

       
                     
  Console.WriteLine();

       
                     
  Console.WriteLine();

       
                     
  Console.WriteLine("QName namespace = [" + complexInstance.QName.Namespace
+ "]");  //results in “urn:Namespace” 

 

       
                     
  string s = Console.ReadLine();

       
        }

}

 

Nader

From: Nader Oteifa [mailto:]

Sent: Thursday, December 03, 2009 12:55 PM

To: 

Subject: [wsrp-interop] Empty value for XMLNS

 

It appears that there is not a issue with
specifying an empty value for the XMLNS in .NET for XML serialization in
the latest version of .NET.  However, it may have been an issue with
prior versions so I will do some more digging.

 

Nader