• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Из хелпа по парсеру взял ....
Думаю он подойдет
Мне надо искать определенные сочетания слов и заменять их xml-кодом хотспота
 
Последнее редактирование модератором:
O

Omh

Насколько я помню, задача была что-то вроде в таблице заменить теги на хотспоты.
Ща гляну, что там було!
 
O

Omh

Глянул на вскидку:
Я бы делал примерно так:
скорее всего взял бы все параграфы по
<!--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 например :(
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Для меня XML вообще темный лес....как для начала - взял процедуру их хелпа... работает... находит то что надо... меняет... а вот только в документе не отображается :(
 
O

Omh

ну хз
Начни с того, что замени текст тага, на, например текщее время.
Текст тага получить Node.FirstChild.NodeValue если ты на node, которая "par" (как я показывал в примере)
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
делаю вот так
Код:
		Case DOMNODETYPE_TEXT_NODE:		  ' Plain text node

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

Omh

Вообще Source.Serialize применяет изменения кагбэ...

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

Хотя может можно и просто сменить NodeValue, не уверен
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Нет... все таки бестолковым быть сложно :(
Source.Serialize вызывал не в том месте :(
 
O

Omh

Кагбэ рекурсивно.
В хелпе есть процедурка в экземплах - WalkTree кажись.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 963
611
BIT
319
чем "так" заниматься - лучше XSLT изучить... ;)
и не надо будет хардкодить
а то - рекурсия...
 
O

Omh

rinsk
Я что-то там не вижу обходов потомков ;)
Я вижу там получили все ноды "attachmentref" и погнали.

Правда, я в текущей задаче тоже не понимаю, зачем углублятся.
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Кагбэ рекурсивно.
В хелпе есть процедурка в экземплах - WalkTree кажись.
есть такая. вот только как ты и говорил... надо делать замену нода. а в этой функции не могу подобраться к родителю... он теряется когда берутся потомки нода ;)
 
O

Omh

Если не учить XSLT, то я бы делал так:

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

Как-то так.

Мне кажется, тут рекурсия не очень нужна.
 

NickProstoNick

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

Omh

Не, "par" это для каждой строки
Для ячейки будет "tablecell"

Экспортни док в файл, посмотри, как он устроен.
 

NickProstoNick

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 963
611
BIT
319
дык нэймспейс нужен другой и как ноду создавать (как мне кажется)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!