2016-06-10 5 views
1

Ich habe ein Skript in PHP, das eine XML-Datei erstellt.Include Schema Link in XML mit Hilfe von PHP

$xml1 = "<?xml version='1.0' encoding='utf-8'?>\n"; 
$xml1 .= "\t<invoices>\n"; 
$xml1 .= "\t\t<journal>\n"; 

Ich müsste ein Schema auf „Rechnungen“ hinzufügen, so dass die XML-Ausgabe sieht wie folgt aus:

<invoices xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd"> 

Was ich versuche ich immer eine Fehlermeldung und die XML-Datei nicht ist erstellt. Wie kann ich das lösen oder wo finde ich Informationen zum korrekten Einfügen der gewünschten Schema-Verknüpfung?

Was ich bisher versucht, ist die Verbindung mit verschiedenen Lösungen einschließlich "hinzuzufügen, oder"

$xml1 .= "\t<invoices xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd">\n"; 
$xml1 .= "\t<invoices 'xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd"'>\n"; 

Danke

ADDON

Der folgende Fehler erscheint, wenn die erstellte Datei öffnen mit Ihrer Lösung:

$xml1 .= "\t<invoices xsi:noNamespaceSchemaLocation=\"http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd\">\n"; 

XML Parsing Err oder: Präfix nicht zu einem Namensraum gebunden

  <invoices xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd"> 
--------^ 

LÖSUNG:

Der folgende Code wurde die Lösung für mich:

$xml1 = "<?xml version='1.0' encoding='utf-8'?>\n"; 
    $xml1 .= "\t<invoices xmlns='http://www.w3schools.com' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd'>\n"; 
    $xml1 .= "\t\t<journal>\n"; 
+0

Wie versuchen Sie, diesen Schema-Link derzeit hinzuzufügen? – cb0

+0

Zusätzlich zu der Frage von @ cb0, könnten Sie auch Ihre Frage aktualisieren, um den Fehler anzuzeigen, den Sie bekommen ("Ich erhalte immer einen Fehler") –

Antwort

1

Versuchen Sie nicht, xml die durch die String-Verkettung zu erstellen. Du wirst es schwer haben, dies zu tun. Verwenden Sie eine bestimmte PHP-API zum Erstellen von XML-Dokumenten.

Hier ist ein minimales Beispiel, das eine invoices.xml erstellen wird.

/* create a dom document with encoding utf8 */ 
$domtree = new DOMDocument('1.0', 'UTF-8'); 

/* create the root element of the xml tree */ 
$xmlRoot = $domtree->createElement("xml"); 
/* append it to the document created */ 
$xmlRoot = $domtree->appendChild($xmlRoot); 

$invoices = $domtree->createElement("invoices"); 

$invoices->setAttribute('xsi:noNamespaceSchemaLocation', 'http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd'); 
$invoices = $xmlRoot->appendChild($invoices); 

$journal = $domtree->createElement("journal"); 
$journal = $invoices->appendChild($journal); 

$domtree->save("invoices.xml"); 

Inhalt wird:

<?xml version="1.0" encoding="UTF-8"?> 
<xml><invoices xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd"><journal/></invoices></xml> 

Addon: Basierend auf Ihren Kommentar und Post bearbeiten, ich glaube, Sie müssen nur die " in der Zeichenfolge zitieren.

$xml1 .= "\t<invoices xsi:noNamespaceSchemaLocation=\"http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd\">\n"; 
+0

Vielen Dank für diese Lösung. Ich werde definitiv versuchen, meine Skripte in Zukunft auf diese Weise zu lösen. Würdest du auch eine Möglichkeit sehen, wie du es so lösen kannst, wie es schon gemacht ist. Das Skript ist ziemlich lang, so dass die Anpassung Stunden dauern würde. Es funktioniert auch sehr gut neben dem Link, der fehlt. – user3358102

+0

Ich habe meiner Antwort ein 'Addon' hinzugefügt. Denken Sie, dass Sie nur "in Ihrer Zeichenkette zitieren müssen. Jedoch fügen Sie bitte noch die genaue Fehlermeldung hinzu, die Sie erhalten! – cb0

+0

Ahh! Gut, dann hat das nichts mit dem Aufbauen des xml aber mit dem Bestätigen des Resultats zu tun. Es gibt eine gute Antwort [hier] (http://stackoverflow.com/a/17138402/85737), die Ihnen helfen könnten. Und es gibt einige andere Fragen hier auf SO mit der genau gleichen Fehlermeldung. – cb0

1

Das Attribut wie xsi:noNamespaceSchemaLocation verwendet einen Namespacepräfix. Wegen des Präfixes a nehmen wir an, dass es sich um den Namensraum http://www.w3.org/2001/XMLSchema-instance handelt.

Namespaces müssen definiert werden, sie werden jedoch als erforderlich definiert, wenn Sie die Namespace-aware-Methoden der DOM-API verwenden. Das Ende mit dem Suffix NS.

$document = new DOMDocument(); 
$document->appendChild(
    $document->createElement('invoices') 
); 
$document->documentElement->setAttributeNS(
// namespace 
'http://www.w3.org/2001/XMLSchema-instance', 
// attribute name including namespace prefix 
'xsi:noNamespaceSchemaLocation', 
// attribute value 
'http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd' 
); 
$document->documentElement->appendChild(
    $document->createElement('journal') 
); 

$document->formatOutput = TRUE; 

Output:

<?xml version="1.0"?> 
<invoices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://schema.aptic.net/aptic-link-import-ledgeraccounts-v2.xsd"> 
    <journal/> 
</invoices> 

Man kann sehen, dass die erzeugte Ausgabe enthält ein xmlns Attribut, das die durch den nampespace xsi Präfix verwendet wird, definiert.

Die XML-Ansicht in den Browsern verbirgt häufig die Namespace-Definitionen. Überprüfen Sie die Quelle, um dies hier zu bestätigen.

Sie können dieselben XML-Zeichenfolgenfunktionen generieren. Wenn Sie dies tun, beachten Sie, dass Sie bei Bedarf Werte ignorieren können.

+0

Vielen Dank für Ihre Eingabe.Ich habe die Lösung hinzugefügt, die für mich arbeitete. :) Danke! – user3358102