Pregunta

Para una operación de una sola vez, necesito analizar el contenido de una cadena XML y cambiar los números del " ID " campo. Sin embargo, no puedo arriesgarme a cambiar nada más de la cadena, por ejemplo. espacios en blanco, saltos de línea, etc. ¡DEBEN permanecer como están!

Dado que hice la experiencia de que XmlReader tiende a ensuciar los espacios en blanco e incluso puede reformatear su XML, no quiero usarlo (pero siéntase libre de convencerme de lo contrario). Esto también grita para RegEx pero ... no soy bueno en RegEx, particularmente no con la implementación de .NET.

Aquí hay una pequeña parte de la cadena, el número del campo ID debe actualizarse en algunos casos. Puede haber muchas entradas de VAR en la cadena. Entonces necesito convertir cada ID a Int32, comparar & amp; modifíquelo y luego vuelva a colocarlo en la cadena.

<VAR NAME="sf_name" ID="1001210">

Estoy buscando la forma más sencilla (en términos de tiempo de codificación) y la más segura para hacerlo.

¿Fue útil?

Solución

El patrón de expresiones regulares que está buscando es:

ID="(\d+)"

El grupo de coincidencias 1 contendría el número. Use un MatchEvaluator Delegate para reemplazar las coincidencias con reemplazos calculados dinámicamente.

Regex r = new Regex("ID=\"(\\d+)\"");
string outputXml = r.Replace(inputXml, new MatchEvaluator(ReplaceFunction));

donde ReplaceFunction es algo como esto:

public string ReplaceFunction(Match m)
{
  // do stuff with m.Groups(1);
  return result.ToString();
}

Si lo necesita, puedo expandir la expresión regular para que coincida más específicamente. Actualmente se reemplazan los valores de ID de todos (que solo contienen números). También puede construir ese bit de "inteligencia adicional" en la función del evaluador de coincidencias y hacer que devuelva la coincidencia sin cambios si no desea cambiarla.

Otros consejos

Eche un vistazo a esta propiedad PreserveWhitespace en clase XmlDocument

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