Fasil Hayat's blog

...C#, .Net, Sharepoint, BizTalk, JQuery...

Et uheldigt symptom på noget xmldata, der i en løsning ikke accepterer namespace prefixes, kan det desværre være nødvendigt at fjerne dem. Har man data i følgende format:

   1:  <?xml version="1.0" encoding="utf-8"?>
   2:  <ns0:MineXmlData xmlns:ns0="http://www.google.com/schemas/minedata">
   3:      <ns0:Personer>
   4:          <ns0:Person></ns0:Person>
   5:      </ns0:Personer>
   6:  </ns0:MineXmlData>


Kan man med følgende regexp fjerne 'ns0' prefix fra xml data.

   1:  (?<=<)[a-zA-Z0-9]+:|(?<=/)[a-zA-Z0-9]+:|(?<=xmlns):.+?(?==)


.Net kode:

   1:  /// <summary>
   2:  /// Fjerner namespace prefix fra xml data.
   3:  /// </summary>
   4:  /// <param name="xmlData">xml data.</param>
   5:  /// <returns>Xml data uden namespace prefix.</returns>
   6:  public static XmlDocument FjernNamespacePrefix(string xmlData)
   7:  {
   8:      string pattern = "(?<=<)[a-zA-Z0-9]+:|(?<=/)[a-zA-Z0-9]+:|(?<=xmlns):.+?(?==)";
   9:      var regXml = new Regex(pattern, RegexOptions.Compiled);
  10:      
  11:      var behandletXmlDokument = new XmlDocument();
  12:      behandletXmlDokument.LoadXml(regXml.Replace(xmlData, string.Empty));
  13:      
  14:      return behandletXmlDokument;
  15:  }


Dette er dog ikke særligt velset, da namespaces netop gør xml repræsentationen typestærkt og undgåelse af sammenfald med andre xml data af samme navn. Hvis der er en god grund til at fjerne namespaces, kan ovenstående regexp bruges.



Efter flere timers kamp med følgende fejl, fandt jeg endelig roden til problemet.

If ref is present, all of <complexType>, <simpleType>, <key>, <keyref>, <unique>, nillable, default, fixed, form, block, and type must be absent.


Umiddelbart kan der være flere muligheder. Hvad fejlbeskrivelsen ret banalt hentyder til, er lige nøjagtigt det, der er problemet. I første omgang lyder det som en ret kryptisk fejl, som jeg ganske enkelt heller aldrig har set før.
I dette tilfælde var det nemlig ulovlig brug af 'Nillable' i en 'ref, der viste sig at være problemet. Dog kunne man ikke helt se hvor fejlen lå, da der var en del nestede schemaer med reference ('ref's).

<xs:element ref="ent:Entitet" nillable="true" minOccurs="0"/>

rettet til:

<xs:element ref="ent:Entitet" minOccurs="0"/>

Et par timers kamp og man er lige pludselig blevet en smule klogere på xml schemaer.



Fasil Malik Hayat

Developer
.Net, WCF, Sharepoint, MOSS, Biztalk, JQuery.

linkedin facebook twitter plaxo google+ grooveshark boxee
fasil

Education

fasil

Bachelor of Science (Honours)
De Montfort University, Leicester.

Fag: Java, MVC, Information Strategy, ITIL

Microsoft Certified Technology Specialist

Skills

.net vs2010 - C# sharepoint sql server jquery ubuntu java netbeans


  

Sign in