Используя URL поиска Твиттера т.е. возвраты http://search.twitter.com/search.rss?q=android CSS, который имеет объект, который похож:
-
@UberTwiter still waiting for @ubertwitter android app!!!
http://twitter.com/meals69/statuses/21158076391
still waiting for an app!!!
Sat, 14 Aug 2010 15:33:44 +0000
http://twitter.com/meals69/statuses/21158076391
Some Twitter User
http://a1.twimg.com/profile_images/756343289/me2_normal.jpg
recent
Довольно простой. Мой код анализирует все (заголовок, ссылка, описание, pubDate, и т.д.) без любых проблем. Однако я надеваю пустой указатель:
Я использую Java для парсинга канала RSS. Я должен обработать составной объект localnames по-другому, чем я был бы более простой localname?
Это - бит кода, который анализирует Ссылку, Описание, pubDate, и т.д.:
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
super.endElement(uri, localName, name);
if (this.currentMessage != null){
if (localName.equalsIgnoreCase(TITLE)){
currentMessage.setTitle(builder.toString());
} else if (localName.equalsIgnoreCase(LINK)){
currentMessage.setLink(builder.toString());
} else if (localName.equalsIgnoreCase(DESCRIPTION)){
currentMessage.setDescription(builder.toString());
} else if (localName.equalsIgnoreCase(PUB_DATE)){
currentMessage.setDate(builder.toString());
} else if (localName.equalsIgnoreCase(GUID)){
currentMessage.setGuid(builder.toString());
} else if (uri.equalsIgnoreCase(AVATAR)){
currentMessage.setAvatar(builder.toString());
} else if (localName.equalsIgnoreCase(ITEM)){
messages.add(currentMessage);
}
builder.setLength(0);
}
}
startDocument похож:
@Override
public void startDocument() throws SAXException {
super.startDocument();
messages = new ArrayList();
builder = new StringBuilder();
}
startElement похож:
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, name, attributes);
if (localName.equalsIgnoreCase(ITEM)){
this.currentMessage = new Message();
}
}
Tony
Такой элемент, как
, имеет локальное имя image_link
, принадлежащее пространству имен google
. Вам необходимо убедиться, что инфраструктура синтаксического анализа XML знает о пространствах имен, и тогда вам нужно будет найти этот элемент, используя соответствующее пространство имен.
Например, несколько интерфейсов SAX1 в пакете org.xml.sax
объявлены устаревшими, заменены аналогами SAX2, которые включают поддержку пространства имен (например, SAX1 Parser
устарел и заменен на SAX2 XMLReader
). Обратитесь к документации о том, как указать пространство имен uri
или квалифицированное (с префиксом) qName
.
Из образца на самом деле не ясно, к какому пространству имен привязывается префикс 'google' - предыдущий ответ немного неверен, поскольку он НЕ находится в пространстве имен "google"; скорее, это пространство имен, к которому привязывается префикс "google". Таким образом, вы должны соответствовать пространству имен (идентифицированному URI), а не префиксу. SAX действительно имеет запутанный способ сообщения о комбинациях локального имени / префикса пространства имен, и это зависит от того, включена ли вообще обработка пространства имен.
Вы также можете рассмотреть альтернативные библиотеки / API для обработки XML; Хотя реализации SAX производительны, существуют более быстрые и удобные альтернативы. Реализации Stax (javax.xml.stream. *), Такие как Woodstox (и даже стандартная реализация JDK 1.6), быстра и немного удобнее. А библиотека StaxMate , построенная на основе Stax, намного проще в использовании как для чтения, так и для записи, а также быстрее, чем реализации SAX, такие как Xerces. Кроме того, у Stax API меньше багажа, связанного с обработкой пространства имен, поэтому легче увидеть, каково фактическое пространство имен элементов.
Как сказано в пользовательских polygenelubricants: обычно синтаксический анализатор должен знать пространство имен, чтобы обрабатывать элементы, которые принадлежат некоторому пространству имен с префиксом. (Подобно этому элементу
.)
Это должно быть установлено как «функция парсера», что AFAIK может быть выполнено несколькими различными способами: Сам интерфейс XMLReader имеет метод setFeature ()
, который можно использовать для установки функций для определенного синтаксического анализатора, но вы также можете использовать тот же метод для класса SAXParserFactory, чтобы эта фабрика генерировала синтаксические анализаторы с уже включенными или выключенными функциями. Флаги стандартных функций SAX2 должны быть на веб-сайте SAXproject, но по крайней мере некоторые из них также перечислены в документации Java API пакета org.xml.sax .
Для простых документов вы можете попробовать воспользоваться ярлыком.Если вам на самом деле не важны пространства имен и имена элементов, как в комбинации URL + local-name, и вы можете быть уверены, что элементы, которые вы ищете (и только они), всегда имеют определенный префикс и что нет элементов из другие пространства имен с таким же локальным именем, тогда вы можете просто решить свою проблему, используя параметр qname
метода startElement ()
вместо localName
или наоборот, или добавив / удаление префикса из строки имени тега, с которой вы сравниваете.
Содержимое параметров namespaceUri
, qname
или localName
в соответствии со спецификациями Java является фактически необязательным, и AFAIK они могут иметь значение null
для эта причина. Какие из них являются нулевыми
, зависит от того, какие вышеупомянутые «функции синтаксического анализатора» влияют на пространства имен. Я не знаю, может ли параметр null
различаться между элементами в пространстве имен и элементами без пространства имен - я не исследовал такое поведение.
PS. XML чувствителен к регистру. Поэтому в идеале вам не нужно игнорировать регистр при сравнении строк имени тега.
-Первый пост, ура!