Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Michael Новенький участник форума
Зарегистрирован: 28.05.2008 Сообщения: 4 Откуда: Canada
|
Добавлено: Ср Май 28, 2008 15:56 Заголовок сообщения: Вопрос ламера |
|
|
Привет всем,
Я экспериментирую с програмным чтением формата fb2. Использую Visual Studio 2005 и XSL.
Изначально тестовый документ (http://www.fictionbook.org/index.php/%D0%A2%D0%B5%D1%81%D1%82%D0%BE%D0%B2%D1%8B%D0%B9_%D0%BE%D0%B7%D0%BD%D0%B0%D0%BA%D0%BE%D0%BC%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82_FictionBook_2.1) отказывался читаться, но когда я убрал строку xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" из элемента FictionBook,то все заработало. Вопрос, почему и как с этой проблемой обходиться?
Спасибо,
Миша |
|
Вернуться к началу |
|
|
GribUser Автор формата FB2 - Автор библиотеки FB
Зарегистрирован: 30.09.2004 Сообщения: 2475 Откуда: Москва
|
Добавлено: Ср Май 28, 2008 17:14 Заголовок сообщения: |
|
|
Это вам поддержка Visual Studio 2005 должна объяснить. Само по себе объявление умалчиваемого нэймспейса на читабельности документа сказываться не должно. |
|
Вернуться к началу |
|
|
Gremlin2 Новенький участник форума
Зарегистрирован: 06.04.2008 Сообщения: 70
|
Добавлено: Ср Май 28, 2008 21:44 Заголовок сообщения: |
|
|
Michael писал(а): | Я экспериментирую с програмным чтением формата fb2. Использую Visual Studio 2005 и XSL. |
А какое отношение имеет XSL к чтению формата fb2? И что значит "отказывался читаться" , если не работает XPath, то достаточно использовать XmlNamespaceManager, например:
Код: | XmlDocument document = new XmlDocument();
document.Load(filename);
XmlNamespaceManager nsManager = new XmlNamespaceManager(document.NameTable);
nsManager.AddNamespace("fb", "http://www.gribuser.ru/xml/fictionbook/2.0");
nsManager.AddNamespace("xlink", "http://www.w3.org/1999/xlink");
XmlNodeList xmlNodes = document.SelectNodes("/fb:FictionBook/fb:body", nsManager); |
|
|
Вернуться к началу |
|
|
Michael Новенький участник форума
Зарегистрирован: 28.05.2008 Сообщения: 4 Откуда: Canada
|
Добавлено: Чт Май 29, 2008 6:03 Заголовок сообщения: |
|
|
Gremlin2 - спасибо, я попробую.
Я пытался сделать всё в самом базовом варианте, не через объекты .NET а через XSLT и дебагирование XSLT.
Цитата: | <?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<!--
This is an XSLT template file. Fill in this area with the
XSL elements which will transform your XML to XHTML.
-->
<xsl:value-of select ="/FictionBook/description/title-info/author/first-name"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet> |
Вот в таком варианте я не могу получить искомый first-name.
Если сделать <xsl:value-of select ="/"/> то выбирается весь документ.
А если убрать аттрибут xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" , то первый вариант начинает работать и выдаёт first-name...
[/quote]
Добавлено спустя 55 минут 10 секунд:
Gremlin2 - попробовал:
Цитата: |
Dim strB As StringBuilder = New StringBuilder
Dim xmlDoc As XmlDocument = New XmlDocument
xmlDoc.Load(pXML)
'Dim root As XmlNode = xmlDoc.FirstChild.NextSibling
'Dim oManager As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable)
strB.Append("Автор:")
' oManager.AddNamespace("fb", "http://www.gribuser.ru/xml/fictionbook/2.0")
' oManager.AddNamespace("xlink", "http://www.w3.org/1999/xlink")
Dim xNode As XmlNode = xmlDoc.SelectSingleNode("/FictionBook/description/title-info/author/first-name")
strB.Append(xNode.InnerXml)
strB.Append(" ")
xNode = xmlDoc.SelectSingleNode("/FictionBook/description/title-info/author/last-name")
strB.Append(xNode.InnerXml)
Return strB.ToString
End Function
|
Та же самая петрушка - единственный вариант который выдаёт "Автор:Дмитрий Грибов" когда убираю из xml документа xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" |
|
Вернуться к началу |
|
|
Gremlin2 Новенький участник форума
Зарегистрирован: 06.04.2008 Сообщения: 70
|
Добавлено: Чт Май 29, 2008 9:09 Заголовок сообщения: |
|
|
Michael писал(а): | Вот в таком варианте я не могу получить искомый first-name.
Если сделать <xsl:value-of select ="/"/> то выбирается весь документ.
А если убрать аттрибут xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" , то первый вариант начинает работать и выдаёт first-name... |
А если так:
Код: | <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:fb="http://www.gribuser.ru/xml/fictionbook/2.0" exclude-result-prefixes="fb xlink">
<xsl:output method="xml" encoding="UTF-8" indent="yes" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<xsl:template match="/*">
<html>
<head>
<title>
<xsl:value-of select="fb:description/fb:title-info/fb:book-title"/>
</title>
</head>
</html>
</xsl:template>
</xsl:stylesheet>
|
Или так:
Код: | Dim strB As StringBuilder = New StringBuilder
Dim xmlDoc As XmlDocument = New XmlDocument
xmlDoc.Load(pXML)
Dim oManager As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable)
strB.Append("Автор:")
oManager.AddNamespace("fb", "http://www.gribuser.ru/xml/fictionbook/2.0")
oManager.AddNamespace("xlink", "http://www.w3.org/1999/xlink")
Dim xNode As XmlNode = xmlDoc.SelectSingleNode("/fb:FictionBook/fb:description/fb:title-info/fb:author/fb:first-name", oManager)
strB.Append(xNode.InnerXml)
strB.Append(" ")
xNode = xmlDoc.SelectSingleNode("/fb:FictionBook/fb:description/fb:title-info/fb:author/fb:last-name", oManager)
strB.Append(xNode.InnerXml)
Return strB.ToString
|
Т.е указываем namespaces документа с префиксами, и далее в xpath выражениях используем эти префиксы. |
|
Вернуться к началу |
|
|
Michael Новенький участник форума
Зарегистрирован: 28.05.2008 Сообщения: 4 Откуда: Canada
|
Добавлено: Ср Июн 04, 2008 8:20 Заголовок сообщения: |
|
|
Первый вариант с грехом пополам работает - в XSL
Вот тут нашёл примеры http://www.gribuser.ru/xml/fictionbook/2.0/xsl/export/
А второй увы нет пока что. Если есть идеи то буду очень им рад, а пока что буду пробовать.
Добавлено спустя 28 минут 33 секунды:
Ну вот, кое что получилось
Код: | Dim strB As StringBuilder = New StringBuilder
Dim xmlDoc As XmlDocument = New XmlDocument
xmlDoc.Load(pFileName)
Dim oManager As XmlNamespaceManager = New XmlNamespaceManager(xmlDoc.NameTable)
strB.Append("Автор:")
oManager.AddNamespace("fb", "http://www.gribuser.ru/xml/fictionbook/2.0")
oManager.AddNamespace("xlink", "http://www.w3.org/1999/xlink")
Dim xRoot As XmlNode = xmlDoc.SelectSingleNode("/")
Dim xFB As XmlNode = xRoot.FirstChild.NextSibling
Dim xNode As XmlNode = xFB.SelectSingleNode("fb:description/fb:title-info/fb:author/fb:first-name", oManager)
strB.Append(xNode.InnerXml)
strB.Append(" ")
xNode = xFB.SelectSingleNode("fb:description/fb:title-info/fb:author/fb:last-name", oManager)
strB.Append(xNode.InnerXml)
Return strB.ToString
End Function |
Вот так заработало. Правда остаётся для полного счастья найти путь без сиблингов - но это уже дело техники и изучения xPath-а. |
|
Вернуться к началу |
|
|
|