2017-12-01 1 views
1

ich folgendes Problem, ich brauche die „cfdi_“ entfernen „CFDI:“Vervielfältigung von XML-Namespaces in SQL

ich die Namespace verwendet, das zu lösen, sondern sie werden von jedem Knoten dupliziert und ich kann nicht beseitigen, wenn Sie mir helfen könnte ich es

declare @Mydoc xml; 

set @Mydoc = (SELECT 
        '' as importe, 
        (SELECT Importe, TasaCuota, TipoFactor, Impuesto, Base 
        FROM CDFIDet 
        FOR XML RAW('cfdi_traslado'), TYPE, ROOT('cfdi_traslados')) 
       FROM 
        CFDIENC 
       FOR XML RAW('cfdi_gatito'),type) 

SELECT @Mydoc; 

Result1 schätzen würde:

<cfdi:gatito importe=""> 
    <cfdi:traslados> 
    <cfdi:traslado Importe="1920" TasaCuota="0" TipoFactor="Tasa" Impuesto="16" Base="240" /> 
    <cfdi:traslado Importe="2202" TasaCuota="0" TipoFactor="TASA" Impuesto="16" Base="450" /> 
    </cfdi:traslados> 
</cfdi:gatito> 

Zweiter Versuch:

declare @Mydoc xml; 

WITH xmlnamespaces ('uri' as cfdi) 
    SELECT @Mydoc = (SELECT 
         '' AS importe, 
         (SELECT Importe, TasaCuota, TipoFactor, Impuesto, Base 
          FROM CDFIDet 
          FOR XML RAW('cfdi:traslado'), TYPE, ROOT('cfdi:traslados')) 
        FROM CFDIENC 
        FOR XML RAW('cfdi:gatito'), TYPE) 

SELECT @Mydoc; 

Ergebnis:

<cfdi:gatito xmlns:cfdi="uri" importe=""> 
    <cfdi:traslados xmlns:cfdi="uri"> 
    <cfdi:traslado Importe="1920" TasaCuota="0" TipoFactor="Tasa" Impuesto="16" Base="240" /> 
    <cfdi:traslado Importe="2202" TasaCuota="0" TipoFactor="TASA" Impuesto="16" Base="450" /> 
    </cfdi:traslados> 
</cfdi:gatito> 

Mein Code ist größer und es wird wiederholt, zu oft, und ich weiß nicht, wie sie

+0

XML-Unterstützung ist ** sehr Hersteller-spezifisch ** - also fügen Sie bitte ein Tag hinzu, um anzugeben, ob Sie 'mysql',' postgresql', 'sql verwenden -server', 'oracle' oder' db2' - oder etwas ganz anderes. –

+0

es ist SQL-Server, aber ich werde nicht lassen Sie dieses Tag setzen, weil ich noch neu bin – carlitus212

+0

Also was ist das gewünschte Ergebnis? –

Antwort

0

Von XML prospektiven zweites Ergebnis autarke ist XML-Element zu beseitigen, Das erste Ergebnis kann nur ein Teil eines anderen Elements sein, wobei der Namespace für das Präfix cfdi definiert ist. Also, ich denke alles funktioniert wie du es definiert hast.

Sub-select

(SELECT Importe, TasaCuota, TipoFactor, Impuesto, Base 
         FROM CDFIDet 
         FOR XML RAW('cfdi:traslado'), TYPE, ROOT('cfdi:traslados')) 

produziert autarke Ergebnis als

<cfdi:traslados xmlns:cfdi="uri"> 
    <cfdi:traslado Importe="1920" TasaCuota="0" TipoFactor="Tasa" Impuesto="16" Base="240" /> 
    <cfdi:traslado Importe="2202" TasaCuota="0" TipoFactor="TASA" Impuesto="16" Base="450" /> 
</cfdi:traslados> 

weil Sie ROOT('cfdi:traslados') definiert - Sie Namespace in sie und verschachtelte Elemente cfdi:traslado im gleichen Namensraum sind - es gibt keine separate Namespace-Deklaration

dann von oben aus:

SELECT 
    '' AS importe, 
    (SELECT Importe, TasaCuota, TipoFactor, Impuesto, Base 
     FROM CDFIDet 
      FOR XML RAW('cfdi:traslado'), TYPE, ROOT('cfdi:traslados')) 
FROM CFDIENC 
    FOR XML RAW('cfdi:gatito'), TYPE) 

definiert ein Wurzelelement für cfdi:traslados als cfdi:gatito es für cfdi prefix seinen eigenen Namensraum-Deklaration hat.

Ich bin nicht vertraut mit SQL-Server-XML, aber was passiert, wenn Sie ROOT('cfdi:traslados') von sub-select entfernen? Wird es xmlns:cfdi="uri" von <cfdi:traslados xmlns:cfdi="uri"> Element entfernen?

+0

das Problem, dass die allgemeine xml und mehr für eine Abrechnung ein bestimmtes Format benötigt und wenn ich die Namensräume deklariere, habe ich Werbung für jeden Knoten und ich muss alles wie oben setzen, aber nur ersetzen "cfdi_" mit " cfdi: " – carlitus212

+0

Sorry Frage noch nicht klar zu mir ... technisch gesehen sind beide Ergebnisse die gleichen, wenn in Result1 Wurzelelement (am nächsten) oben auf' 'deklariert den Namespace für' cfdi' Präfix als 'xmlns: cfdi =" uri "'. – Vadim

+0

ist einfach Bruder, schau ich brauche xsi herauskommen: schemaLocation und xmlns: cfdi aber mit den Namespaces kann ich kein Präfix xsi deklarieren da die xmlns sich überlappen und ansonsten erzeuge ich das in jedem Knoten die Namespaces setzen und ich kann nicht beseitigen – carlitus212

1

Es ist ärgerlich, aber gültige Ausgabe ... Jede Sub-Select mit einer FOR XML-Anweisung wird seine eigenen Satz von Namespace-Deklarationen hinzufügen. Es gibt ein sehr altes - aber ignoriert! - Microsoft Connect issue Geh hin und stimme dafür.

Es gibt keine echte Workaround, nur ein paar Hacks. Die meisten Leute enden mit einigen hässlichen Tricks auf String-Ebene. In diesem Fall erstellen Sie das XML ohne Namespace und ändern es mit Zeichenfolgenmethoden, wenn Sie fertig sind.

In Ihrer anderen Frage hatten Sie die Idee, das Präfix zu Ihren Aliasen wie cfdi_Element hinzuzufügen und später zu cfdi:Element zu ändern.

Das ist genau das, was ich rede ...

Aber noch einmal: Es ist nicht falsch, nur ärgerlich und Ihre Ausgabe Blähungen ...

Versuchen Sie Folgendes: deklarieren @Mydoc xml;

WITH xmlnamespaces ('uri' as cfdi) 
SELECT @Mydoc = (SELECT 
         'SomeValue' AS OuterElement, 
         (SELECT 'OtherValue' AS InnerElement 
         FOR XML RAW('cfdi:traslado'), TYPE) 
        FOR XML RAW('cfdi:gatito'), TYPE) 

--Die Namespace-Deklaration

SELECT @Mydoc; 

<cfdi:gatito xmlns:cfdi="uri" OuterElement="SomeValue"> 
    <cfdi:traslado xmlns:cfdi="uri" InnerElement="OtherValue" /> 
</cfdi:gatito> 

repliziert wird --Aber hier ist es "funktioniert"

SELECT @Mydoc = (SELECT 
         'SomeValue' AS OuterElement, 
         (SELECT 'OtherValue' AS InnerElement 
         FOR XML RAW('cfdi_traslado'), TYPE) 
        FOR XML RAW('cfdi_gatito'), TYPE) 

--Eine cast NVARCHAR(MAX), Decl ns-die in die Wurzel Knoten und einige ersetzt:

SELECT CAST(REPLACE(REPLACE(CAST(@Mydoc AS NVARCHAR(MAX)),'<cfdi_gatito','<cfdi_gatito xmlns:cfdi="uri"'),'cfdi_','cfdi:') AS XML); 

<cfdi:gatito xmlns:cfdi="uri" OuterElement="SomeValue"> 
    <cfdi:traslado InnerElement="OtherValue" /> 
</cfdi:gatito> 

Das ist hässlich, aber oft die einzige Chance ...

+0

SIE SIND MEIN HELD VON ECHO DAS IST VIEL MEHR EINFACH UND ER HINZUFÜGT NOTEN, DIE MIR DIE WAHRHEIT VERPASSEN, DASS SIE SEHR VIEL SEHR DANKEN, SIE SIND MEIN HELD – carlitus212

Verwandte Themen