Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: DonnySantiago en 26 Agosto 2015, 19:04 pm



Título: Modificar archivo xml
Publicado por: DonnySantiago en 26 Agosto 2015, 19:04 pm
Hola buen dìa,

Soy nuevo en esto , tengo un archivo .txt que tiene cierto contenido xml , como por ejemplo :
<nombre> Donny </nombre>
Pero hay casos que este archivo contiene etiquetas de contenido vacío como por ejemplo:
<Numero> </numero>
Mi duda es la siguiente , como haria para eliminar esas etiquetas de contenido vacío, claro esta que esas etiquetas pueden varias no solo será <Numero></Numero> , sino también aparecerán etiquetas como <Direccion></Direccion> que también tendrán contenido vacío.

Esto lo puedo realizar con algún programa que lo haga de manera automática , osea que reconozca el archivo que estará en una carpeta en especifica y lo modifique automáticamente.

Algo por ahí escuche del batch ? , se puede hacer con .net ?


Título: Re: Modificar archivo xml
Publicado por: engel lex en 26 Agosto 2015, 23:23 pm
con batch sería una locura hacerlo con .net seria programable... la cosa es que no vayas a romper alguna dependencia

es decir no sea algo como
Código:
<persona>
  <nombre>pepito</nombre>
  <apellido>palotes</apellido>
</persona>

en ese caso si nombre estuviera vacio y lo borras, te arriesgas a que el programa que use el xml tenga un fallo

con .net tendrías que hacer esa verificación


Título: Re: Modificar archivo xml
Publicado por: explorer en 26 Agosto 2015, 23:25 pm
Se puede hacer con un poco de Perl, desde la misma línea de comandos...

Código
  1. perl -E '$_ = do { local $/; open F, $ARGV[0]; <F> }; s{^\s*<(\w+)>\s*</\1>\s?\n}{}gm; print' code_38243.xml
(cambiando code_38243.xml por el nombre del archivo xml a procesar).

Con este archivo de entrada:
Código
  1. <data>
  2.  <meta>
  3.    <sender type="IMEI">400234062240570</sender>
  4.    <receiver type="E-mail Account">usuario@micorreo.com</receiver>
  5.    <time>2015-01-10T19:52:06Z</time>
  6.    <protocol>SBD</protocol>
  7.    <type>NAL GPS Report 6</type>
  8.    <Numero> </Numero>
  9.    <Direccion></Direccion>
  10.  </meta>
  11. </data>
el resultado es:
Código
  1. <data>
  2.  <meta>
  3.    <sender type="IMEI">400234062240570</sender>
  4.    <receiver type="E-mail Account">usuario@micorreo.com</receiver>
  5.    <time>2015-01-10T19:52:06Z</time>
  6.    <protocol>SBD</protocol>
  7.    <type>NAL GPS Report 6</type>
  8.  </meta>
  9. </data>
La misma solución, en forma de programa:
Código
  1. #!/usr/bin/perl
  2. $xml = do { local $/; open F, $ARGV[0]; <F> }; # leer nombre de archivo desde la línea de comandos
  3. $xml =~ s{^\s*<(\w+)>\s*</\1>\s?\n}{}gm; # quitar etiquetas sin contenido
  4. print $xml; # resultado


Título: Re: Modificar archivo xml
Publicado por: Eleкtro en 27 Agosto 2015, 08:12 am
Algo por ahí escuche del batch ? , se puede hacer con .net ?

.Net sería la mejor opción o al menos una de las mejores, al ser una solución amistosa, sencilla y extremadamente eficiente, ya que la librería de classes de .Net proporciona miembros muy sofisticados para el parsing y edición de documentos XML, cómo XElement, Xmlelement, XDoc, XmlDocument, etc, puediendo llevar a cabo la misma tarea de diversas maneras según "X" necesidades (con ciertas excepciones);
sin mencionar que además la IDE Visual Studio exprime al máximo sus elaboradas características añadiendo acceso inmediato en tiempo de diseño a los miembros del documento XML, con la posibilidad opcional de añadir/activar IintelliSense (auto completado de los nombres de los miembros del documento XML).

Sin duda la utiización de .Net junto a Visual Studio le da un significado nuevo y extraordinario a la manipulación programática o automatizada de este tipo de documentos, ya que Visual Studio marca un antes y un despues practicamente en todo lo relacionado con la experiencia proporcianada al usuario final en comparación con cualquier otra IDE para cualquier otro lenguaje, y aparte, la librería de classes de .Net Framework no tiene rival en cuanto a cantidad de miembros y a su calidad de elaboración (soy muy fan, tenía que escribir todo esto).

El código que te voy a mostrar de ejemplo es algo muy simple, ya que la tarea no requiere más, y de todas formas aquí no se piden tareas, pero bueno...:

Ejemplo, en VisualBasic.Net:
Código
  1. Dim sourceFilepath As String = "C:\source.xml"
  2. Dim targetFilepath As String = "C:\target.xml"
  3. Dim fileEncoding As Encoding = Encoding.Default 'Código de página ANSI del S.O. actual (cp1252 / windows-1252)
  4. Dim fileContent As String = File.ReadAllText(sourceFilepath, fileEncoding)
  5.  
  6. Dim doc As XDocument = XDocument.Parse(fileContent, LoadOptions.None)
  7. With doc
  8.    .Descendants().Where(Function(element As XElement) String.IsNullOrWhiteSpace(element.Value)).Remove()
  9.    .Save(targetFilepath, SaveOptions.None)
  10. End With
(declaré esas variables para que no te pierdas)

Documento original:
Código
  1. <?xml version="1.0" encoding="windows-1252"?>
  2. <rootElement>  
  3.  <!-- empty address field -->
  4.  <child1>
  5.    <name>X</name>
  6.    <adress></adress>
  7.  </child1>
  8.  <!-- empty element and sub-elements -->
  9.  <child2>
  10.    <name></name>
  11.    <adress></adress>
  12.  </child2>
  13. </rootElement>

Resultado de ejecución:
Código
  1. <?xml version="1.0" encoding="Windows-1252"?>
  2. <rootElement>
  3.  <!-- empty address field -->
  4.  <child1>
  5.    <name>X</name>
  6.  </child1>
  7.  <!-- empty element and sub-elements -->
  8. </rootElement>

Es un ejemplo. En caso de que lo uses ten en cuenta que puedes personalizarlo cómo prefieras, por ejemplo, si tienes elementos hijos con elementos sub-hijos y solo quieres eliminar los sub-hijos vacíos, entonces puedes indicar con una simple condiciónal, que se expresen los elementos hijos vacios en la modificación ( <elemento_hijo_vacio /> ).

PD: También puedes utilizar el módulo xml de Python, por poner un ejemplo diferente a C#/VB.Net.

Saludos