Разобрать файл .xml в определенном way

grep procesará su flujo de entrada estándar, y sshpuede usarse para ejecutar un comando de forma remota que genera una salida. Esta salida puede ser procesada localmente por grepy redirigida a un archivo local:

ssh...some options... some_command | grep...options etc... >outputfile

Por ejemplo,

ssh user@server cat file1 file2 file3 | grep 'pattern' >localfile
1
09.02.2018, 14:06
3 ответа

Asumiendo lo siguiente (modificado )XML:

<?xml version="1.0"?>
<root>
  <ContactPerson>
    <GivenName>John</GivenName>
    <FamilyName>Wayne</FamilyName>
    <PhoneFixList>
      <PhoneFix>78787878</PhoneFix>
    </PhoneFixList>
    <EmailList>
      <Email>john.wayne@gmail.com</Email>
    </EmailList>
  </ContactPerson>
  <ContactPerson>
    <GivenName>James</GivenName>
    <FamilyName>Stewart</FamilyName>
    <PhoneFixList>
      <PhoneFix>90909090</PhoneFix>
    </PhoneFixList>
    <EmailList>
      <Email>james.stewart@gmail.com</Email>
    </EmailList>
  </ContactPerson>
</root>

El XMLStarlet invocación

xml sel -t -m '//ContactPerson' -v 'concat(GivenName, " ", FamilyName, " ", PhoneFixList/PhoneFix, " ", EmailList/Email)' -nl file.xml

produce

John Wayne 78787878 john.wayne@gmail.com
James Stewart 90909090 james.stewart@gmail.com

La invocación de XMLStarlet contiene un bucle implícito sobre todos los nodos ContactPerson, y para cada uno de estos, los campos específicos se concatenan para producir la salida correcta. El -nlal final hace que se imprima una nueva línea.

3
28.04.2021, 23:50

Conxml2(y un shell con soporte para las $'...'comillas):

{ echo "<r>"; cat file.xml; echo "</r>"; } |
  | xml2 | 2csv -d $'\t' ContactPerson GivenName FamilyName EmailList/Email

(para ContactPersons con más de una dirección de correo electrónico, se devuelve la última)

1
28.04.2021, 23:50

Si está de acuerdo con tener un segundo archivo para procesar esto, puede crear un archivo XSLT y usarlo para transformar su archivo XML usando xsltproc.

teléfonos.xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="ContactPerson">
  <xsl:value-of select="GivenName"/><xsl:text> </xsl:text><xsl:value-of select="FamilyName"/>
  <xsl:for-each select="PhoneFixList/PhoneFix">
    <xsl:text> </xsl:text><xsl:value-of select="."/>
  </xsl:for-each>
  <xsl:for-each select="EmailList/Email">
    <xsl:text> </xsl:text><xsl:value-of select="."/>
  </xsl:for-each>
  <xsl:text>&#xA;</xsl:text>
</xsl:template>
</xsl:stylesheet>

Luego transforme el archivo (usando el XML de @Kusalananda comophones.xml):

$ xsltproc phones.xsl phones.xml
John Wayne 78787878 john.wayne@gmail.com
James Stewart 90909090 james.stewart@gmail.com

El uso de XSLT tiene la ventaja de que puede recorrer elementos repetitivos, generar resultados condicionales, etc. Si te sientes cómodo con un poco de estudio y programación, es muy poderoso.

1
28.04.2021, 23:50

Теги

Похожие вопросы