ОБСУЖДЕНИЕ

DXL: работа с нодами

33 ответов 2,9 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Из хелпа по парсеру взял пример обхода дерева....
Думаю он подойдет
Мне надо искать определенные сочетания слов и заменять их xml-кодом хотспота
 
Последнее редактирование модератором:
Насколько я помню, задача была что-то вроде в таблице заменить теги на хотспоты.
Ща гляну, что там було!
 
Глянул на вскидку:
Я бы делал примерно так:
скорее всего взял бы все параграфы по
<!--shcode--><pre><code class='vb'>Set NodesList = RootDoc.GetElementsByTagName("par")[/CODE]

Потом иду по этим параграфам
<!--shcode--><pre><code class='vb'>If NodesList.NumberOfEntries > 0 Then
Dim Node As NotesDOMElementNode

Dim i As Integer
For i = 1 To NodesList.NumberOfEntries
Set Node = NodesList.GetItem(i)
If Not Node.IsNull Then
'обработка тут
end if
Next[/CODE]
и проверяю находится ли он в ячейке (<!--shcode--><pre><code class='vb'>Node.ParentNode.NodeName = "tablecell"[/CODE])
и есть ли в ней таг, который надо заменять (<!--shcode--><pre><code class='vb'>Instr(Node.FirstChild.NodeValue, "TAG") <> 0[/CODE])

Если есть, то на его месте строил бы сктрутуру hotspota:
<!--shcode--><pre><code class='xml'><doclink document='FAF5C35113AF1081C225761D004283F2' database='C225737800338EDF' description='Hole' server='ZHOPS'/>[/CODE]
А текст бы випиливал.


Как-то так.

Ничё невозможного, но повозится надо.

Вполне возможно, что это не самый оптимальный алгоритм, просто пришёл в голову первым :(
Можно иди по tablecell например :(
 
Для меня XML вообще темный лес....как для начала - взял процедуру их хелпа... работает... находит то что надо... меняет... а вот только в документе не отображается :(
 
ну хз
Начни с того, что замени текст тага, на, например текщее время.
Текст тага получить Node.FirstChild.NodeValue если ты на node, которая "par" (как я показывал в примере)
 
делаю вот так
Код:
		Case DOMNODETYPE_TEXT_NODE:		  ' Plain text node

If node.NodeValue = "TECT" Then
node.NodeValue = "РАБОТАЕТ!"
End If
но вот нет изменений... хотя условие отрабатывает.
Может как-то надо обновлять парсер... или импортер... или хз что :(
 
Вообще Source.Serialize применяет изменения кагбэ...

А тут мне кажется, что текущую Node надо выпилить, а к её паренту приделать новую:
<!--shcode--><pre><code class='vb'>Dim TextNode As NotesDOMTextNode
Set TextNode = RootDoc.CreateTextNode(ChdValue)
Call ParentNode.AppendChild(TextNode)[/CODE]

Хотя может можно и просто сменить NodeValue, не уверен
 
Нет... все таки бестолковым быть сложно :(
Source.Serialize вызывал не в том месте :(
 
Кагбэ рекурсивно.
В хелпе есть процедурка в экземплах - WalkTree кажись.
 
чем "так" заниматься - лучше XSLT изучить... ;)
и не надо будет хардкодить
а то - рекурсия...
 
rinsk
Я что-то там не вижу обходов потомков ;)
Я вижу там получили все ноды "attachmentref" и погнали.

Правда, я в текущей задаче тоже не понимаю, зачем углублятся.
 
Кагбэ рекурсивно.
В хелпе есть процедурка в экземплах - WalkTree кажись.
есть такая. вот только как ты и говорил... надо делать замену нода. а в этой функции не могу подобраться к родителю... он теряется когда берутся потомки нода ;)
 
Если не учить XSLT, то я бы делал так:

тупо прёшь по "par", анализируешь CurrnetNode(это у нас "par").FirstChild.NodeValue
Если оно, делаешь RemoveNode на CurrentNode.FirstChild
Потом создаешь ноду через NotesDOMDocumentNode и приклеиваешь (AppendChild) к CurrentNode.

Как-то так.

Мне кажется, тут рекурсия не очень нужна.
 
Правда, я в текущей задаче тоже не понимаю, зачем углублятся.
Ну на сколько я понимаю для каждой строки таблицы есть свой par и для каждой ячейки таблицы тоже. грубо говоря что-то вроде этого
Код:
<par> 
<par> Ячейка 1 </par>
<par> Ячейка 2 </par>
<par> Ячейка 3 </par>
</par>
так вот это вернет все par или только один... который для строки?
Код:
Set NodesList = RootDoc.GetElementsByTagName("par")
 
Не, "par" это для каждой строки
Для ячейки будет "tablecell"

Экспортни док в файл, посмотри, как он устроен.
 
par вроде для любой текстовой строки...
фигня получается ;)
Код:
Set TextNode = RootDoc.CreateTextNode(ChdValue)
Так не получается создать HotSpot :)
XML-теги для HOtSpot конвертятся в текст
и выглядят так
Код:
<urllink showborder='false' href='www'><run><font size='8pt' color='system'/>TEST</run></urllink>
 
дык нэймспейс нужен другой и как ноду создавать (как мне кажется)
 

Статистика тем

Создано
NickProstoNick,
Последний ответ от
lmike,
Ответы
33
Просмотры
2 900