Как получить тег «yweather:condition›» из Yahoo Weather RSS с помощью xmllint

Давайте попробуем разобрать и извлечь узел из Yahoo Weather RSS.

URL находится здесь http://weather.yahooapis.com/forecastrss?w=12602818&u=c< /а>

Для этой цели необходимо использовать xmlint.

Вот узел для извлечения:

<yweather:condition  text="Partly Cloudy"  code="30"  temp="3"  date="Fri, 16 Nov 2014 8:10 am AST" />

Проблема

Наивный xmllint --xpath "//yweather:condition" the_rss_file_from_yahoo ответил с ошибкой:

XPath error : Undefined namespace prefix
xmlXPathEval: evaluation failed
XPath evaluation failure

Это должно происходить из-за того, что определено пространство имен. Но мы застряли здесь.

Можно ли получить этот узел с помощью xmlint в командной строке? И если да, то как?

Редактировать/Ответить: поскольку вопрос был помечен как дублированный, если вы новичок в XPath, как я, и ищете однострочное решение, вы можете использовать xmllint filename --xpath "//*[local-name()='condition']" с двумя косыми чертами, противоположными другому вопросу, который использовал один (потому что он обращался к корневому узлу). Однако формальный способ решить эту проблему см. в ответе A) из исходного вопроса и используйте // вместо / в запросе XPath (спасибо, Томалек, за помощь).


person the_yellow_logo    schedule 05.12.2014    source источник
comment
Мне потребовалось менее 30 секунд, чтобы найти дубликат вашего вопроса. Это как минимум в 10 раз меньше времени, чем вам потребовалось для его написания. Подумай об этом.   -  person Tomalak    schedule 05.12.2014
comment
Привет, Томалак. На самом деле я прочитал тот ответ, который вы опубликовали, прежде чем опубликовать мой. Тем не менее, это не сработало для меня, и, похоже, я не получу помощи от другого вопроса. Что еще более важно, поскольку Yahoo Weather API очень используется, я подумал, что заданный точный вопрос (xmllint+Yahoo weather) поможет некоторым людям, например, из Google.   -  person the_yellow_logo    schedule 05.12.2014
comment
Вы не указали, что вы пробовали с пространствами имен, это немного изменило бы ситуацию. Однако ваш вопрос вовсе не относится к API Yahoo. Речь идет о работе с пространствами имен XML в xmllint, просто и понятно. Я не проверял, но уверен, что документация расскажет вам все, что вам нужно, если вы знаете ключевое слово. И именно поэтому этот вопрос по-прежнему является дубликатом. :)   -  person Tomalak    schedule 05.12.2014
comment
Кроме того, вопрос, вероятно, не тот же, потому что xmllint --debug отвечает с другой структурой, чем его: ELEMENT yweather:condition вместо его пространства имен ELEMENT по умолчанию для чата href=purl.org/net/ulf/ns/0.4-02 . Вероятно, поэтому решение там не работает для меня (у меня нет указанного пространства имен, как у него). (Хотя я понимаю, как они выглядят одинаково на поверхности. И, возможно, это мое неправильное обращение с xmllint делает их непохожими)   -  person the_yellow_logo    schedule 05.12.2014
comment
Пространство имен по умолчанию ничем не отличается от обычного пространства имен. Ему просто не хватает префикса, поэтому вывод отладки немного отличается. Проблема остается точно такой же: вы должны сообщить этот URI пространства имен, прежде чем вы сможете выполнить запрос xpath. Параметры командной строки для этого одинаковы в обоих случаях.   -  person Tomalak    schedule 05.12.2014
comment
Ну, вы, очевидно, лучше знаете, но два его решения не сработали для меня. Например, для его решения B) я пробовал и xmllint the_rss_file --xpath "/*[local-name()='condition']", и xmllint the_rss_file --xpath "/*[namespace-uri()='http://xml.weather.yahoo.com/ns/rss/1.0' and local-name()='condition']", и оба ответили XPath set is empty   -  person the_yellow_logo    schedule 05.12.2014
comment
Теперь есть то, что вы должны были публиковать с самого начала. Попробуйте xmllint the_rss_file --xpath "//*[local-name()='condition']" (обратите внимание на двойную косую черту. Возможно, вы также освежите некоторые основы xpath). Но на самом деле это решение неоптимально. Перейти к правильному объявлению URI пространства имен.   -  person Tomalak    schedule 05.12.2014
comment
Что касается его решения A) xmllint --shell the_rss_file, я набрал setns yweather=http://xml.weather.yahoo.com/ns/rss/1.0, а затем xpath /yweather:condition в другой строке и получил Object is a Node Set : Set contains 0 nodes:.   -  person the_yellow_logo    schedule 05.12.2014
comment
Двойная косая черта, как я уже сказал. / соответствует только корневому узлу.   -  person Tomalak    schedule 05.12.2014
comment
Нет, вопрос закрыт, на него больше нельзя ответить. Вы решили свою проблему, и это хорошо, и будущие посетители, скорее всего, столкнутся с проблемой «Я не знаю, как работают пространства имен XML», поэтому дубликат все еще действителен. От моего POV делать нечего.   -  person Tomalak    schedule 05.12.2014
comment
Хорошо, я отредактировал свой вопрос, чтобы помочь людям, но понял вашу точку зрения, еще раз спасибо.   -  person the_yellow_logo    schedule 05.12.2014
comment
В следующий раз: я нашел этот другой вопрос, и я попробовал это... и это... но это не сработало. Где моя ошибка? Это значительно ускорило бы дело. ;)   -  person Tomalak    schedule 05.12.2014