Comment Parse XML avec des caractères non valides dans le nom de noeud?
-
21-08-2019 - |
Question
Je suis en train d'analyser certains XML, dont la création n'est pas sous mon contrôle. Le problème est, ils ont en quelque sorte obtenu des noeuds qui ressemblent à ceci:
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(MORNINGSTAR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(QUARTERSTAFF) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(SCYTHE) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRATNYR) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(TRIPLE-HEADED_FLAIL) />
<ID_INTERNAL_FEAT_FOCUSED_EXPERTISE_(WARAXE) />
Visual Studio et .NET à la fois le sentiment que les « ( » et « ) » caractères, tel qu'il est utilisé ci-dessus, sont totalement invalides. Malheureusement, je dois traiter ces fichiers! Est-il possible d'obtenir les classes lecteur Xml de ne pas paniquer en voyant ces personnages, ou leur échapper dynamiquement ou quelque chose? Je pouvais faire une sorte de pré-traitement sur l'ensemble du dossier, mais je ne veux les « ( » et « ) » caractères si elles apparaissent à l'intérieur du nœud d'une manière valable, donc je ne veux pas simplement supprimer tous. ..
La solution
C'est tout simplement pas valide. Pré-traitement est votre meilleur-pari, peut-être avec regex - quelque chose comme:
string output = Regex.Replace(input, @"(<\w+)\((\w+)\)([ >/])", "$1$2$3");
Edit: un peu plus complexe pour remplacer le "-" entre les crochets:
string output = Regex.Replace(input, @"(<\w+)\(([-\w]+)\)([ >/])",
delegate(Match match) {
return match.Groups[1].Value + match.Groups[2].Value.Replace('-', '_')
+ match.Groups[3].Value;
});
Autres conseils
Si ce n'est pas syntaxiquement valide, ce n'est pas XML.
XML est très stricte à ce sujet.
Si vous ne pouvez pas obtenir l'application d'envoi d'envoyer XML correct, juste leur faire savoir que tout processus aval voit ce échouera , que ce soit le vôtre ou certains autre application à l'avenir.
Si est pré-traitement pas une option, un autre mécanisme intelligent est d'envelopper l'objet qui est Stream
transmis à l'analyseur avec un flux personnalisé. Ce flux pourrait rechercher des caractères <
, et quand il voit, mettre un drapeau. Jusqu'à ce qu'un caractère est voir >
, il pourrait manger des personnages ou (
)
. Nous avons utilisé quelque chose comme ça pour se débarrasser de NUL et ^ caractères Z ajoutés à un fichier XML par un mécanisme de transport existant. (Le seul Gotcha il pourrait y avoir des caractères à l'intérieur d'<=> un attribut, car ils ne doivent pas être échappé là -. Seulement <=> caractères font)