Pregunta

Así que estoy tratando de analizar algunos de XML, la creación de los cuales no está bajo mi control. El problema es que han nodos que se parecen a esto de alguna manera consiguieron:

<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 .NET y ambos se sienten que los caracteres '(' y ')', tal como se utiliza anteriormente, son totalmente nulas estudio. Por desgracia, tengo que procesar estos archivos! ¿Hay alguna manera de obtener las clases XML Reader se asuste al ver a estos personajes, o dinámicamente escapar de ellos o algo así? Podría hacer algún tipo de pre-procesamiento en todo el archivo, pero deseo que los caracteres '(' y ')' si aparecen dentro del nodo de alguna manera válida, por lo que no desee simplemente eliminarlos todos. ..

¿Fue útil?

Solución

Eso simplemente no es válida. Pre-procesamiento es su mejor apuesta, tal vez con expresiones regulares - algo como:

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

Editar: un poco más complejo para reemplazar el "-" dentro de los corchetes:

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

Otros consejos

Si no es sintácticamente válida, no es XML.

XML es muy estricto acerca de esto.

Si usted no puede conseguir la aplicación de envío para enviar XML correcto, entonces simplemente hacerles saber que lo ve proceso aguas abajo de este se producirá un error , ya sea la suya o alguna otra aplicación en el futuro.

Si pre-procesamiento no es una opción, es otro mecanismo inteligente para envolver el Stream objeto que se pasa al analizador con un flujo personalizado. Esa corriente podría buscar < personajes, y cuando ve uno, establecer un indicador. Hasta que un personaje es > ver, podría comer cualquier carácter o ( ). Hemos usado algo como esto para deshacerse de NUL y caracteres ^ Z añadido a un archivo XML mediante un mecanismo de transporte legado. (La única Gotcha puede haber <=> caracteres dentro de un atributo, ya que no tienen que ser escapado allí -. <=> sólo personajes hacen)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top