Test Foro de elhacker.net SMF 2.1

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
<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 (bash) [Seleccionar]
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 (xml) [Seleccionar]
<data>
 <meta>
   <sender type="IMEI">400234062240570</sender>
   <receiver type="E-mail Account">usuario@micorreo.com</receiver>
   <time>2015-01-10T19:52:06Z</time>
   <protocol>SBD</protocol>
   <type>NAL GPS Report 6</type>
   <Numero> </Numero>
   <Direccion></Direccion>
 </meta>
</data>
el resultado es:
Código (xml) [Seleccionar]
<data>
 <meta>
   <sender type="IMEI">400234062240570</sender>
   <receiver type="E-mail Account">usuario@micorreo.com</receiver>
   <time>2015-01-10T19:52:06Z</time>
   <protocol>SBD</protocol>
   <type>NAL GPS Report 6</type>
 </meta>
</data>

La misma solución, en forma de programa:
Código (perl) [Seleccionar]
#!/usr/bin/perl
$xml = do { local $/; open F, $ARGV[0]; <F> }; # leer nombre de archivo desde la línea de comandos
$xml =~ s{^\s*<(\w+)>\s*</\1>\s?\n}{}gm; # quitar etiquetas sin contenido
print $xml; # resultado

Título: Re: Modificar archivo xml
Publicado por: Eleкtro en 27 Agosto 2015, 08:12 AM
Cita de: DonnySantiago en 26 Agosto 2015, 19:04 PMAlgo 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 (vbnet) [Seleccionar]
Dim sourceFilepath As String = "C:\source.xml"
Dim targetFilepath As String = "C:\target.xml"
Dim fileEncoding As Encoding = Encoding.Default 'Código de página ANSI del S.O. actual (cp1252 / windows-1252)
Dim fileContent As String = File.ReadAllText(sourceFilepath, fileEncoding)

Dim doc As XDocument = XDocument.Parse(fileContent, LoadOptions.None)
With doc
   .Descendants().Where(Function(element As XElement) String.IsNullOrWhiteSpace(element.Value)).Remove()
   .Save(targetFilepath, SaveOptions.None)
End With

(declaré esas variables para que no te pierdas)

Documento original:
Código (xml) [Seleccionar]
<?xml version="1.0" encoding="windows-1252"?>
<rootElement>  
 <!-- empty address field -->
 <child1>
   <name>X</name>
   <adress></adress>
 </child1>
 <!-- empty element and sub-elements -->
 <child2>
   <name></name>
   <adress></adress>
 </child2>
</rootElement>


Resultado de ejecución:
Código (xml) [Seleccionar]
<?xml version="1.0" encoding="Windows-1252"?>
<rootElement>
  <!-- empty address field -->
 <child1>
   <name>X</name>
 </child1>
  <!-- empty element and sub-elements -->
</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