PHP SimpleXML ne conserver les sauts de ligne dans les attributs XML
J'ai pour analyser externe fourni XML qui a des attributs avec des sauts de ligne dans les. À l'aide de SimpleXML, les sauts de ligne semblent être perdu. Selon une autre question stackoverflow, les sauts de ligne doit être valide (même si beaucoup moins que l'idéal!) pour XML.
Pourquoi sont-ils perdus? [edit] Et comment puis-je les conserver? [/edit]
Voici une démo fichier de script (à noter que lorsque les sauts de ligne ne sont pas dans un attribut ils sont conservés).
Fichier PHP avec XML incorporé
$xml = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<Rows>
<data Title='Data Title' Remarks='First line of the row.
Followed by the second line.
Even a third!' />
<data Title='Full Title' Remarks='None really'>First line of the row.
Followed by the second line.
Even a third!</data>
</Rows>
XML;
$xml = new SimpleXMLElement( $xml );
print '<pre>'; print_r($xml); print '</pre>';
Sortie de print_r
SimpleXMLElement Object
(
[data] => Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[Title] => Data Title
[Remarks] => First line of the row. Followed by the second line. Even a third!
)
)
[1] => First line of the row.
Followed by the second line.
Even a third!
)
)
- Vous devriez poser cette question en PHP page d'accueil. Je suppose que c'est parce que c'est SIMPLE analyseur xml.
- Pouvez-vous expliquer un peu plus ce que tu veux dire par le PHP page d'accueil?
- Initialement, votre question était "Pourquoi SimpleXML est ce qu'il fait?" C'est ce que vous pouvez demander, c'est aux développeurs de ne pas les utilisateurs.
- Gotcha - merci pour la recommandation, Zilupe. Maintenant que bobince a répondu "Pourquoi SimpleXML est ce qu'il fait?" Je pense que je vais garder cette sur stackoverflow, dans l'espoir que quelqu'un peut ajouter sur ce que d'autres options que j'ai à conserver les sauts de ligne!
Vous devez vous connecter pour publier un commentaire.
L'entité pour une nouvelle ligne est
. J'ai joué avec votre code jusqu'à ce que j'ai trouvé quelque chose qui a fait le tour. Ce n'est pas très élégant, je vous préviens:L'hypothèse, basée sur votre exemple, c'est que toutes les nouvelles lignes qui se produisent à l'intérieur d'un nœud ou d'un attribut aura plus de texte sur la ligne suivante, pas un
<
pour ouvrir un nouvel élément.Bien sûr, cela serait un échec si votre prochaine ligne a peu de texte qui a été enveloppé dans une ligne de niveau élément.
Oui, c'est prévu... en fait, il est nécessaire de tout conforme à XML parser des retours à la ligne dans les valeurs d'attributs représentent de simples espaces. Voir la valeur de l'attribut de la normalisation dans le XML spécification.
Si il était censé être un véritable caractère de saut de ligne dans la valeur de l'attribut XML devrait comporter une
référence de caractère au lieu d'un raw de retour à la ligne.\n
quand il signifie
c'est un bug. (Et surprenant, car c'est une caractéristique fondamentale que toute XML serialiser serait prévu pour obtenir le droit... à moins bien sûr, le service est nettoyage autour de avec la regex ou de la chaîne de création de modèles au lieu d'utiliser une bonne bibliothèque XML!)
s en est aussi un peu un non-starter, que vous devriez écrire plus d'un analyseur XML déjà à être en mesure de faire la différence entre un saut de ligne dans une valeur d'attribut et un autre à l'intérieur d'une balise (où
serait illégal). Hacks comme Anthony pourrait fonctionner comme une solution temporaire si l'exacte mise en forme est très verrouillé pour le moment.code
il y a, semble être une faille dans la balise autour de&...;
ou quelque chose...)En supposant que $xmlData est votre chaîne XML avant de les envoyer à l'analyseur, ce qui devrait remplacer tous les retours à la ligne dans les attributs avec la bonne entité. J'ai eu le problème avec XML à venir à partir de SQL Server.
Probablement peut se faire plus simplement avec une regex, mais ce n'est pas un point fort pour moi.
Voici le code à remplacer les lignes par le caractère approprié de référence dans ce fragment XML. Exécutez ce code avant l'analyse.
C'est ce qui a fonctionné pour moi:
Tout d'abord, obtenir le xml comme une chaîne de caractères:
Puis faire le remplacement:
Le "." et "< comme:eol/>" étaient là parce que j'ai besoin d'ajouter des pauses dans ce cas. Les nouvelles lignes "\n" peut être remplacé par ce que vous voulez.
Après le remplacement, il suffit de charger le xml-string comme un objet SimpleXMLElement:
Et Voilà
Bien, cette question est vieux, mais comme moi, quelqu'un pourrait venir à cette page par la suite.
J'ai eu approche légèrement différente et je pense que le plus élégant de ces cités.
À l'intérieur de l'xml, vous mettez une parole unique qui vous permettra de l'utiliser pour la nouvelle ligne.
Changement xml pour
Et puis, quand vous obtenez chemin d'accès souhaité nœud dans SimpleXML en sortie de chaîne écrire quelque chose comme ceci:
Il n'a pas à être '\n, il peut être l'unique char.