Что нового

Чтение метатегов из fb2

eus_deus

Новичок
Сообщения
118
Репутация
0
Доброго времени суток!
Путем путешествий по сети нашел такой код:
Код:
Global $g_oXML
Global $Filename = "d:\Books\test\FB2\Анджей Сапковский & Станислав Бересь - История и фантастика.fb2"
$g_oXML = ObjCreate("Microsoft.XMLDOM")        

If $g_oXML.load($Filename) Then
    Local $oNode = $g_oXML.SelectSingleNode("//FictionBook/description/title-info")
    $sLastName = _ReadXMLNodeText($oNode, "author/last-name")
    $sMiddleName = _ReadXMLNodeText($oNode, "author/middde-name")
    $sFirstName = _ReadXMLNodeText($oNode, "author/first-name")
    $sGenre = _ReadXMLNodeText($oNode, "genre")
    $sSequenseName = _ReadXMLNodeAttrib($oNode, "sequence", "name")
    $sSequenseNumber = _ReadXMLNodeAttrib($oNode, "sequence", "number")
    $sBookTitle = _ReadXMLNodeText($oNode, "book-title")
EndIf

Func _ReadXMLNodeText($oXMLobj, $sNode)
    Local $result = $oXMLobj.SelectSingleNode($sNode)
    If IsObj($result) Then
        Return $result.text
    Else
        Return ""
    EndIf
EndFunc   ;==>_ReadXMLNodeText

Func _ReadXMLNodeAttrib($oXMLobj, $sNode, $sAttrib)
    Local $sXPath = $sNode & "[@" & $sAttrib & "]"
    Local $result = $oXMLobj.SelectSingleNode($sXPath)
    If IsObj($result) Then
        Return $result.getAttribute($sAttrib)
    Else
        Return ""
    EndIf
EndFunc   ;==>_ReadXMLNodeAttrib


Но в данном случае не могу понять, как считать данные, если автор не один?
Вроде есть функция SelectNodes, но как ее применить и какого вида данные она должна получать не пойму - переменные и массивы у меня выходили пустые

Отрезок со структурой:
<?xml version="1.0" encoding="UTF-8"?>
<FictionBook xmlns="http://www.gribuser.ru/xml/fictionbook/2.0" xmlns:l="http://www.w3.org/1999/xlink">
<description>
<title-info>
<book-title>Польская фэнтези (сборник)</book-title>
<author><first-name>Анджей</first-name><last-name>Сапковский</last-name></author>
<author><first-name>Яцек</first-name><last-name>Собота</last-name></author>
<author><first-name>Томаш</first-name><last-name>Колодзейчак</last-name></author>
<author><first-name>Яцек</first-name><last-name>Дукай</last-name></author>
<genre>sf_fantasy</genre>
<annotation><p>Поклонники польской фэнтези! Вы и вправду верите, что в этом жанре все «началось с Сапковского и им же заканчивается»? Вы не правы! Хотите проверить? Пожалуйста! Перед вами — ПОЛЬСКАЯ ФЭНТЕЗИ как она есть. Повести и рассказы — озорные и ироничные, мрачновато-суровые, философские и поэтичные, ОЧЕНЬ разные — и ОЧЕНЬ талантливые. НЕ ПРОПУСТИТЕ!</p><empty-line/></annotation>
<date/>
<coverpage>
<image l:href="#cover.jpg"/></coverpage>
<lang>ru</lang>
<src-lang>pl</src-lang>
<translator>
<first-name>Евгений</first-name>
<middle-name>Павлович</middle-name>
<last-name>Вайсброт</last-name>
</translator>
<translator>
<first-name>Е.</first-name>
<last-name>Барзова</last-name>
</translator>
<translator>
<first-name>Г.</first-name>
<last-name>Мурадян</last-name>
</translator>
</title-info>
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
SelectNodes возвращает так называемую коллекцию - массив объектов. Коллекцию можно обойти (обработать) целиком с помощью In или обратиться к элементу по индексу через item
Код:
$Authors = $oNode.SelectNodes("author")
; количество элементов в коллекции
ConsoleWrite($Authors.length & @CRLF)
; обход всей коллекции
For $Auth In $Authors
  ConsoleWrite($Auth.text & @CRLF)
Next
ConsoleWrite("----------" & @CRLF)
; обращение к элементу коллекции по индексу
For $i = 0 To $Authors.length - 1
  ConsoleWrite($Authors.item($i).text & @CRLF)
Next
 
Автор
E

eus_deus

Новичок
Сообщения
118
Репутация
0
Inni,
что - то в таком виде autoit больно на python похож.
Спасибо за разъяснения
 
Верх