Como extraio um único atributo de um arquivo XML?

2

Eu não estou familiarizado com a regex, sed, etc. e com um pouco de preguiça para descobrir isso neste exato momento, então como extrair essa linha:

<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

Deixe-me saber se mais da estrutura xml é necessária.

    
por knl 24.03.2015 / 01:05

3 respostas

4

Como os dados de entrada (seu arquivo XML) estão estruturados, é melhor usar uma consulta nesses dados estruturados, em vez de tratá-los como texto sem formatação e mexer com expressões regulares.

Podemos usar xmllint --xpath para avaliar uma expressão XPath em sua entrada xml:

$ xmllint --xpath 'string(rss/channel/*[local-name()="astronomy"]/@sunrise)' weather.xml
6:48 am

- isso é um pouco confuso, já que temos que lidar com os diferentes namespaces nesse arquivo, mas funciona mesmo assim.

Para mais informações sobre o XPath, a especificação está no link

    
por Jeremy Kerr 24.03.2015 / 02:04
3

Você não usa regex nem sed. Você usa um analisador XML e uma linguagem de consulta XML (XPath ou XQuery). E receio que os detalhes dependam do contexto: por exemplo, "yweather" é um nome abreviado (prefixo) para um namespace e você precisa saber qual namespace representa.

    
por Michael Kay 24.03.2015 / 01:24
2

A resposta correta, como diz Michael Kay, é usar uma ferramenta específica para XML.

Para uma solução rápida e suja, aqui está uma abordagem sed. Vamos começar com este arquivo:

$ cat file
<yweather:astronomy sunrise="6:50 am" sunset="7:06 pm"/>

Para extrair o tempo do pôr-do-sol:

$ sed -rn 's/.*sunset="([^"]*)".*//p' file
7:06 pm

Para entender o regex, vamos dividi-lo em três partes:

  1. .* corresponde do início da linha até a segunda parte

  2. Esta parte, sunset="([^"]*)" , corresponde aos caracteres sunset=" , seguido por qualquer número de caracteres, exceto " , seguido pelo fechamento " . A expressão [^"] significa qualquer caractere, exceto " e [^"]* , qualquer número de tais caracteres. Os parênteses, (...) , capturam os caracteres dentro do "..." no grupo 1 de sed que, posteriormente, referenciamos como .

  3. .* corresponde a todos os caracteres após a expressão do pôr do sol.

por John1024 24.03.2015 / 01:34