none
Expresion Regular sobre xml RRS feed

  • Pregunta

  • Buenos dias,

    Tengo el siguiente problema tengo un texto xml del siguiente tipo:

    <Parrafo id="xexprenta.f8cc2a6992e04625808e26e1c269d139" class="nueve" estado="disponible" tipo="normal" nivel="5" hash="FED656339E64DB2013DA43739A6253" refid="-1" grupo="60869f73277b486f8d68c0bd3f39429e">Las prestaciones por causa de vejez solo tendrán este tratamiento cuando el beneficiario haya cumplido cincuenta y cinco (55) años de edad y haya pertenecido al fondo durante un período no inferior a cinco (5) años.</Parrafo>
      <Parrafo id="xexprenta.972c6950c00f4f35adab973e2fd29c88" class="nueve" estado="disponible" tipo="normal" nivel="5" hash="EB6558934D68E61B829CED9115E093" refid="-1" grupo="60869f73277b486f8d68c0bd3f39429e">No obstante lo anterior, no se exigirá el plazo de cinco (5) años cuando el fondo de pensiones asuma pensiones de jubilación por razón de la disolución de una sociedad, de conformidad con el artículo 246 del Código de Comercio (E.T., art. 207-1).</Parrafo>
      <Parrafo id="xexprenta.2a86ef01090c4ca1a120ee31c497294a" class="nueve-titulo" estado="disponible" tipo="_Prop-2_" nivel="5" hash="D7260731F82294429B272EC1E338B3" refid="-1" grupo="5a6d79a51fbd49bda0ebe7581a0df703">GASTOS DE REPRESENTACIÓN</Parrafo>

    y debo validar que solo aparezca una vez el tag parrafo, despues de probar muchas expresiones tengo esta:

     Regex rx = new Regex(@"\b((?<Parrafo>(\w+\s+)+))(.|\n)*?\b\k<Parrafo>",
                  RegexOptions.Compiled | RegexOptions.IgnoreCase);
    
                MatchCollection coincidencias = rx.Matches(seleccion);

    Donde la coleccion es el texto xml, pero esta validacion falla en el momento que se encuentre la palabra "Parrafo" en el texto del tag "Parrafo". Lo que debo hacer es validar esta cadena donde solo exista un tag parrafo.

    Agradezco mucho su colaboracion.


    jin

    lunes, 23 de julio de 2012 16:43

Todas las respuestas

  • Existen mejores formas de validad XML, diría yo.  ¿Por qué no crea un XSD donde define el maxOccurs = 1?  Luego usa las clases en System.Xml para validar el XML.  O es tan fácil como solicitarle al parser de XML que le dé una colección de todos los párrafos.  Si la colección tiene más de un párrafo es inválido.

    Jose R. MCP
    Code Samples

    lunes, 23 de julio de 2012 19:58
    Moderador
  • Gracias Jose por tu respuesta, pero no es un documento XML, es un fragmento de un XML lo que me llega, no el XML completo.

    jin

    lunes, 23 de julio de 2012 20:24
  • Es igual.

    StringBuilder elXml = new StringBuilder();
    elXml.Append("<?xml version=\"1.0\"><root>");
    elXml.Append(<el texto XML que usted recibe>);
    elXml.Append("</root>");
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(elXml.ToString());
    //Listo.  Use GetElementsByTagName() y cuente cuántos devuelve.


    Jose R. MCP
    Code Samples

    lunes, 23 de julio de 2012 20:44
    Moderador
  • Hola Jose, de nuevo gracias por tu respuesta, pero si observas el trozo de xml que puse en el post original los tags que vienen estan asociados a una hoja de estilos que no tengo, este trozo de xml viene de un servicio que me lo retorna en este formato, por esa razon no puedo crear un documento xml bien formado.

    jin

    lunes, 23 de julio de 2012 20:59