Modificar archivo xml

Iniciado por DonnySantiago, 26 Agosto 2015, 19:04 PM

0 Miembros y 1 Visitante están viendo este tema.

DonnySantiago

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 ?

engel lex

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

explorer

#2
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


Eleкtro

#3
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