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. ..

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top