Pergunta

Então, eu estou tentando analisar alguns XML, cuja criação não está sob meu controle. O problema é que eles nós de alguma forma tem que olhar como esta:

<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 eo .NET tanto sensação de que os personagens '(' e ')', como usado acima, são totalmente inválido. Infelizmente, eu preciso para processar esses arquivos! Existe alguma maneira de obter as classes XML Reader não surtar ao ver esses personagens, ou dinamicamente escapar deles ou algo assim? Eu poderia fazer algum tipo de pré-processamento em todo o arquivo, mas eu quero os caracteres '(' e ')' se eles aparecem dentro do nó de alguma forma válida, então eu não quero apenas removê-los todos. ..

Foi útil?

Solução

Isso simplesmente não é válido. Pré-processamento é o seu melhor-bet, talvez com regex - algo como:

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

Edit: um pouco mais complexo para substituir o "-" dentro dos parênteses:

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

Outras dicas

Se não é sintaticamente válido, não é XML.

XML é muito rigoroso sobre isso.

Se você não pode obter o aplicativo de envio para enviar XML correta, então é só deixá-los saber que qualquer que seja processo a jusante vê este irá falhar , se é seu ou algum outro aplicativo no futuro.

Se o pré-processamento não é uma opção, um outro mecanismo inteligente é para embrulhar o objeto Stream que é passado para o analisador com um fluxo personalizado. Esse fluxo poderia olhar para personagens <, e quando vê um, definir um sinalizador. Até um personagem > é ver, ele poderia comer quaisquer caracteres ( ou ). Nós usamos algo como isto para se livrar de NUL e ^ Z caracteres adicionados a um arquivo XML por um mecanismo de transporte legado. (A única pegadinha pode haver caracteres < dentro de um atributo, uma vez que não tem que ser escapado lá -. Apenas caracteres > fazer)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top