Domanda

Così sto cercando di analizzare un po 'di XML, la cui creazione non è sotto il mio controllo. Il problema è che hanno in qualche modo avuto nodi che assomigliano a questo:

<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 e .NET entrambi ritengono che i caratteri '(' e ')', come quello usato in precedenza, sono del tutto validi. Purtroppo, ho bisogno di elaborare questi file! C'è un modo per ottenere le classi XML Reader di non impazzire nel vedere questi personaggi, o dinamicamente loro o qualcosa di fuggire? Potrei fare una sorta di pre-elaborazione su tutto il file, ma voglio i caratteri '(' e ')' se appaiono all'interno del nodo in qualche modo valido, per cui non voglio rimuovere semplicemente tutti. ..

È stato utile?

Soluzione

Questo semplicemente non è valido. Pre-processing è la vostra migliore-bet, magari con regex - qualcosa come:

string output = Regex.Replace(input, @"(<\w+)\((\w+)\)([ >/])", "$1$2$3");

Edit: un po 'più complessa di sostituire il "-" all'interno delle parentesi:

string output = Regex.Replace(input, @"(<\w+)\(([-\w]+)\)([ >/])",
    delegate(Match match) {
        return match.Groups[1].Value + match.Groups[2].Value.Replace('-', '_')
             + match.Groups[3].Value;
    });

Altri suggerimenti

Se non è sintatticamente valido, non è XML.

XML è molto severa su questo.

Se non è possibile ottenere l'applicazione di invio per inviare corretto XML, poi basta far loro sapere che qualsiasi processo a valle vede questa non riuscirà , se è tuo o di qualche altra applicazione in futuro.

Se la pre-elaborazione non è un'opzione, un altro meccanismo intelligente è quello di avvolgere la Stream oggetto che viene passato al parser con un flusso personalizzato. Questo flusso potrebbe cercare < personaggi, e quando vede uno, impostare un flag. Fino a quando un personaggio è > vedere, si potrebbe mangiare qualsiasi carattere ( o ). Abbiamo utilizzato qualcosa di simile per sbarazzarsi di NUL e ^ Z caratteri aggiunto in un file XML da un meccanismo di trasporto eredità. (L'unica Gotcha ci potrebbe essere <=> caratteri all'interno di un attributo, dal momento che non devono essere sfuggito lì -. Solo <=> personaggi fanno)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top