2010-12-29 11 views
1

Ich bin mir nicht sicher, ob es wichtig ist, aber ich verwende BizTalk 2009, um das XML zu generieren.Verwenden Sie XML-Schema zum Angeben von Standard-Namespace in XML-Instanz

Gibt es eine Möglichkeit, in meinem XML-Schema anzugeben, dass die generierte XML-Instanz den Zielnamespace als Standardnamespace verwenden soll?

Wenn ich eine XSD-Datei wie folgt:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://example.com/"> 
    <xs:element name="example"> 
    <xs:complexType> 
     <xs:attribute name="value" type="xs:string" /> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Es hat eine XML-Datei wie folgt erstellt:

<ns0:example value="something" xmlns:ns0="http://example.com/" /> 

Aber ich will es eine XML-Datei wie folgt zu erstellen:

<example value="something" xmlns="http://example.com/" /> 

Ich weiß, dass sie technisch gleichwertig sind, aber die Verbraucher (Vendor APIs) sind schlecht implementiert und ich würde gerne geben m was sie erwarten.

Antwort

1

Ich würde erwarten, dass es von der Software abhängt, die die Instanz erzeugt, nicht das Schema. XSD-Schema wurde für die Validierung von XML-Instanzen anhand eines Schemas entwickelt, nicht um daraus Instanzen zu generieren. Daher ist es unwahrscheinlich, dass es explizit in XMLSchema vorhanden ist. Die Erzeugungs Werkzeuge könnte, verwenden jedoch die Tatsache, dass die Elemente waren (un) qualifiziert

elementFormDefault="(un)qualified" 

die Vorfixierung auszulösen.

nicht vollständig in Umfang, aber die folgende ist wert für Schema-Design zu lesen: http://www.xfront.com/HideVersusExpose.html

1

Eine Möglichkeit wäre, ein Schema ohne den Namensraum zu definieren. Ordnen Sie das BizTalk-Schema dem neu definierten Schema ohne Namespace zu. Aus Sicht von BizTalk hätten Sie ein Schema, das den tatsächlichen Vertrag mit den Konsumenten darstellt. (d. h. ohne Namespaces) Außerdem verwendet BizTalk den Namespace # rootnodename, um messageTypes zu definieren. In diesem Beispiel würden Sie zwei Schemas

  1. somenamespace # somerootnodename haben
  2. #somerootnodename

Die möglichen Nachteile dieses Ansatzes sind dies würde die Anwendung dieses Schemas (#rootnodename) Begrenzung auf 1 Instanz mit der BizTalk-Gruppe.

1

Dies ist das Standardverhalten von BizTalk, das diese XML-Schemas bearbeitet, und soweit ich weiß, gibt es keine eingebaute Möglichkeit, dies zu ändern.

Was Sie wirklich wollen, ist jedoch, dass ausgehende Nachrichten einem saubereren und liberaleren Format entsprechen als das, was von BizTalk verwendet wird. Sie können dies tun, indem Sie eine benutzerdefinierte Pipelinekomponente (und eine benutzerdefinierte Sendepipeline) verwenden, um die ausgehende Nachricht zu verarbeiten, bevor sie BizTalk verlässt.

Die Idee besteht darin, das Namespacepräfix als Teil des Sendens der Nachricht außerhalb von BizTalk zu ändern. Die Transformation findet während der Verarbeitung der Sendepipeline statt.

Nic Barden hat gebloggt und einige Quellcode zur Verfügung gestellt about this here. Sie können seine Stichprobe als Grundlage für das Ersetzen von Namespacepräfixen verwenden, anstatt Namespaces selbst zu ersetzen.

Ich empfehle Ihnen dringend, die ganze Reihe von Posts zu lesen, die er über das Entwickeln von Streaming-Pipeline-Komponenten gemacht hat. Nic hat umfangreiche und gründliche Arbeit geleistet, um alles zu beschreiben, was benötigt wird, um robuste Pipeline-Komponenten für Unternehmen zu entwickeln.

+0

Bitte lassen Sie mich wissen, wenn Sie Hilfe bei der Einrichtung einer solchen benutzerdefinierten Pipeline-Komponente benötigen. –

1

Die ns0 Präfix hinzugefügt wird, wenn ein BizTalk BTM eine Nachricht abbildet. Es sollte nicht Angelegenheit, da dies immer noch gültig ist XML, aber dies könnte ein Problem sein beim Senden von Nachrichten an Partner mit älteren oder unvollständigen XML-Parsern.

Sie können das ns0 Präfix entfernen und stattdessen ns0 Ihren Standardnamespace in der Ausgabenachricht ändern, indem Sie Ihre BTM von visual map to an .xslt map ändern.

z.B. Sobald Sie Ihre Karte zu Xslt umgewandelt haben, ändern Sie die Xslt aus:

<?xml version="1.0" encoding="utf-16"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       exclude-result-prefixes="msxsl s0" 
       version="1.0" 
       xmlns:ns0="http://targetns" 
       xmlns:s0="http://sourcens" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="s0:FromRoot" /> 
    </xsl:template> 
    <xsl:template match="s0:FromRoot"> 
    <ns0:ToRoot> 
     <xsl:for-each select="s0:FromElement"> 
     <ns0:ToElement> 
      <xsl:value-of select="text()"/> 
     </ns0:ToElement> 
     </xsl:for-each> 
    </ns0:ToRoot> 
    </xsl:template> 
</xsl:stylesheet> 

An:

<?xml version="1.0" encoding="utf-16"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" 
       exclude-result-prefixes="msxsl s0" 
       version="1.0" 
       xmlns="http://targetns" 
       xmlns:s0="http://sourcens" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="s0:FromRoot" /> 
    </xsl:template> 
    <xsl:template match="s0:FromRoot"> 
    <ToRoot> 
     <xsl:for-each select="s0:FromElement"> 
     <ToElement> 
      <xsl:value-of select="text()"/> 
     </ToElement> 
     </xsl:for-each> 
    </ToRoot> 
    </xsl:template> 
</xsl:stylesheet> 

das heißt die xmlns Standard ändern und dann die ns0 Präfixe automatisch entfernen.

Eine allgemeinere Lösung ist ebenfalls möglich (z. B. ähnlich Firras '), die z.B. als Sende-Port-Karte zu platzieren, um alle Präfixe aus Elementen auszublenden. Allerdings muss man vorsichtig sein, wenn mehr als ein xmlns in der Ausgabenachricht vorhanden ist!