Копирование в переменную элемента xml

seoman2

Green Team
17.02.2010
507
1
BIT
72
Есть XML-ка на винте, например такой структуры:

<htmlx xmlns=" link removed">
<RootElement1>
<Element2 Type="S2">123</Element2>
<Element3>
<E4>44444</E4>
<E5>5555</E5>
</Element3>
<Element6>66666</Element6>
</RootElement1>
</htmlx>

Как лучше получить в переменную в виде текстовой строки Element3 ?
 

alexas1

Green Team
10.04.2014
1 202
225
BIT
45
Как лучше получить в переменную в виде текстовой строки Element3 ?
Распарсить:)
Штатными нотусёвыми (и не только) парсерами.
Да хоть left\right\mid - string:)
Гуглить типа parsing XML.
Тут и на форуме была туева хуча вариантов.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Думал с NotesDOMParser через GetElementsByTagName, но он не получает значение элемента с его подэлементами.

Штатными нотусёвыми (и не только) парсерами. - какими?
 

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
Если небольшо XML, то можно DOM использовать ( ).
Если большой - SAX (встроенный или сторонний, JAVA через дрижд).
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
А можно файл в поток загнать и считать с stream.ReadText ?
А потом уже
Хотя это изврат наверное.

XmlNodeReader - где библиотеку скачать? Ссылка че-то не открывается даже.
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
опять...
откуда файл получился на диске?
А можно файл в поток загнать и считать с stream.ReadText ?
такое ощущение, что вы изобретаете себе сложности, при полном нежелании прислушиваться к советам.
Нотусевые классы принимают на вход NotesStream и не надо руками ReadText
прочитайте уже хелп дизайнера, там и примеры есть
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
В итоге распарсил с помощью MS XML Parser.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
дело хозяйское, но я бы использовал нативные объекты.
есть люди , мягко-говоря, странные ;)
в этой схеме остается непонятным выбор платформы, или человек не своим делом занят
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Если через SAX (я с ним не работал еще), то я смогу получить в текстовую строку элемент со всеми подэлементами?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Если через SAX (я с ним не работал еще), то я смогу получить в текстовую строку элемент со всеми подэлементами?
SAX - событийный механизм
проход каждого элемента вызывает событие (CallBack) с передачей параметров

читать про SAX
 
  • Нравится
Реакции: seoman2

oshmianski

Достойный программист
Lotus Team
25.04.2012
711
59
BIT
8
SAX сложнее для понимания и реализации.
Вам нужно определиться с технологией - DOM или SAX.
Если объем обрабатываемого XML маленький (ну скажем до 5 МБ), то проще использовать DOM.
В notes реализованы и DOM и SAX парсеры как нативные классы.
Ссылку, что я давал, - это просто надстройка над нативным DOM парсером (просто сведено все в одно место и примеры человеческие).

DOM - это проще говоря дерево в оперативной памяти (полностью все данные в ОП).
SAX - это как буд-то кадры в окошке кинопроектора (в ОП только один кадр). Т.е. процессор бежит по всей ленте данных и найдя определенную последовательность генерирует соответсвующий вызов функции.

Судя по тому, что вы благополучно использовали MS XML Parser, вам подойдет XMLNoteReader. Просто разберитесь с ним, там ничего сложного нет.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Попробовал и через DOM, и через SAX, что мне не нравиться, что я получаю только сам элемент, а его атрибуты и подэлементы надо снова по дереву искать (если дом), или ждать следующего события с элементом (если сакс). И самому сохранять всё что напарсил. А MS XML Parser дает мне сразу весь объект с атрибутами и подэлементами - как innerhtml в яваскрипте. Мне бы его аналог, но родной в лотусе ))
 

savl

Lotus Team
28.10.2011
2 625
314
BIT
544
@seoman2, нет стандартного, только самописки, как эта:
От я простыню ща запостил... Вот это движок...
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
опять ничего не понимаю...
и так: есть DOM, SAX
остальное - обвязка над одним или другим (условно)
XSLT - после построения DOM
мсхмлпарсёр - это некий конгломерат из всего чего не попадя - комбайн выполняющей все, но "не идеально"
зачем комбайн - если задача узкая?
берем простенький xsl и накладываем его на свой xml - профит

в случае с большими файлами - смотрим "мой" (в коде есть ссылка на оригинал) велик, на основе SAX (LAX) - там проще отловить только нужный тег
либо берем либу VTD-XML (но это уже - доп. либа) - пример выкладывал на интетрасте

 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Код:
%REM
*********************************************
Agent XSLT
Created May 21, 2015 by Mikhail Cholokov/CRUINTERNET
Description: Comments for Agent
%END REM
Option Public
Option Declare
 
Use "ErrorHandling"
Const xml=_
|<htmlx xmlns="http://www.w3.org/1999/xhtml"><RootElement1>
		<Element2 Type="S2">123</Element2>
		<Element3>
			<E4>44444</E4>
			<E5>5555</E5>
		</Element3>
		<Element6>66666</Element6>
</RootElement1></htmlx>|
'xmlns:xs="http://www.w3.org/2001/XMLSchema"
'exclude-result-prefixes="xs"
Const xsl=_
|<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:xx="http://www.w3.org/1999/xhtml"
	version="2.0">
	<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes"/>
	<xsl:template match="xx:RootElement1">
			<xsl:apply-templates select="xx:Element3"/>
	</xsl:template>
	<xsl:template match="xx:Element3">
		<xsl:copy-of select="."/>
		<!--<xsl:copy-of select="*"/>-->
	</xsl:template>
</xsl:stylesheet>|
Sub Initialize
MsgBox Transform(xml,xsl)
End Sub
 
%REM
*--------------------------------------------
Function Transform
Description: Comments for Function
%END REM
function Transform(xml As String, xsl As String) As String
Dim routineName As String
routineName="Transform"
On Error GoTo ErrH
'your code here
	Dim transformer As NotesXSLTransformer, ses As New NotesSession
	Dim strmXML As NotesStream, strmXSL As NotesStream, res As NotesStream
	Set strmXML=ses.Createstream():Set strmXSL=ses.Createstream():Set res=ses.CreateStream()
	strmXML.writetext(xml):strmXSL.Writetext(xsl)
	Set transformer=ses.CreateXSLTransformer(strmXML, strmXSL, res)
	transformer.Inputvalidationoption=False
	Call transformer.Process()
	res.Position=0
	Do
		Transform=Transform & res.Readtext()
	Loop Until res.isEOS
Quit:
Exit Function
ErrH:
Error Err, RaiseError
Resume Quit
End Function
результат:
XML:
<Element3 xmlns="http://www.w3.org/1999/xhtml">
			<E4>44444</E4>
			<E5>5555</E5>
		</Element3>
если в темплейте поменять каменты:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:xx="http://www.w3.org/1999/xhtml"
	version="2.0">
	<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes"/>
	<xsl:template match="xx:RootElement1">
			<xsl:apply-templates select="xx:Element3"/>
	</xsl:template>
	<xsl:template match="xx:Element3">
		<!--<xsl:copy-of select="."/>-->
		<xsl:copy-of select="*"/>
	</xsl:template>
</xsl:stylesheet>
выдаст:
XML:
<E4 xmlns="http://www.w3.org/1999/xhtml">44444</E4>
<E5 xmlns="http://www.w3.org/1999/xhtml">5555</E5>
елси не нужен нэймспэйс (а зачем он?) просто убрать обертывающую ноду (<htmlx>)
 
Последнее редактирование модератором:
Мы в соцсетях:

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