powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Откуда пробелы в .nodeTypedValue
9 сообщений из 9, страница 1 из 1
Откуда пробелы в .nodeTypedValue
    #35965779
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Импортирую гарминовский файл *.tcx, который является xml-документом. Мне необходимо его импортировать в Excel. Для этого использую Microsoft.XMLDOM. Так вот, когда начинаешь изучать свойство nodeTypedValue каждого нода, то очень хорошо видно, что оно содержит все nodeTypedValue дочерних ветвей, причем через пробел . Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Свойство нода Trackpoint:
   xmlChildNods.Item(i).nodeTypedValue = "2008-09-27T11:42:21Z 55.5820553 37.5409098 194.3237305 117 0 Absent" 

Вот так нод Trackpoint выглядит:
<Trackpoint>
  <Time> 2008 - 09 -27T11: 42 :21Z</Time> 
 <Position>
  <LatitudeDegrees> 55 . 5820553 </LatitudeDegrees> 
  <LongitudeDegrees> 37 . 5409098 </LongitudeDegrees> 
  </Position>
  <AltitudeMeters> 194 . 3237305 </AltitudeMeters> 
 <HeartRateBpm>
  <Value> 117 </Value> 
  </HeartRateBpm>
  <Cadence> 0 </Cadence> 
  <SensorState>Absent</SensorState> 
  </Trackpoint>
 <Trackpoint>

Честно говоря, я по своей наивности думал что такое отображение всех дочерних nodeTypedValueчерез пробел является обязательным.
И вот, понадобилось мне сделать теперь уже экспорт из Excel'я в гарминовский формат *.tcx. Я используя xmlDoc.createNode(), xmlDoc.createTextNode() и т.д. заполняю xmlDoc, сохраняю его. И обнаруживаю, что почему то в моем файле nodeTypedValue дочерних ветвей идут подряд без пробела. В чем может быть проблема? это особенности работы Microsoft.XMLDOM?


Для наглядности и для тех кто не смог разобраться в моем путанном изложении выкладываю 2 файла:
оригинальный tcx-файл - Велосипед 000_course.tcx и
файл который я получил после импорта в Excel выше указанного файла и экспорта его из Excel'я в tcx-файл - Велосипед21.tcx.
По идее я должен был получить идентичные файлы.
...
Рейтинг: 0 / 0
Откуда пробелы в .nodeTypedValue
    #35969875
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эксперименты показали, что если тупо в готовый xml-файл, открытый в текстовом режиме, добавить по пробелу перед каждым нодом, то все получается - .nodeTypedValue начинает возвращать .nodeTypedValue дочерних нодов через пробел. Даже скажу больше. XMLDOM в точности повторяет количество пробелов между тегами.

Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Вот такой текст у меня получается когда я сохраняю свой xmlDoc в файл:
<Track><Trackpoint><Time> 2008 - 10 -14T16: 07 :22Z</Time><Position><LatitudeDegrees> 55 . 8080330 </LatitudeDegrees><LongitudeDegrees> 37 . 7874561 </LongitudeDegrees></Position><AltitudeMeters> 167 . 8873291 </AltitudeMeters><HeartRateBpm><Value> 92 </Value></HeartRateBpm><SensorState>Absent</SensorState>

При последующем открытии этого файла через CreateObject("Microsoft.XMLDOM"), я получаю следующее значение нода Track
.nodeTypedValue = "2008-10-14T16:07:22Z55.808033037.7874561167.887329192Absent"

Если же открыть xml-файл в текстовом редакторе и добавить пробелов:
<Track> <Trackpoint> <Time> 2008 - 10 -14T16: 07 :22Z</Time> <Position> <LatitudeDegrees> 55 . 8080330 </LatitudeDegrees> <LongitudeDegrees> 37 . 7874561 </LongitudeDegrees></Position> <AltitudeMeters> 167 . 8873291 </AltitudeMeters> <HeartRateBpm> <Value> 92 </Value></HeartRateBpm> <SensorState>Absent</SensorState>

То при последующем открытии этого файла через CreateObject("Microsoft.XMLDOM"), я получаю следующее значение нода Track
.nodeTypedValue = "2008-10-14T16:07:22Z 55.8080330 37.7874561 167.8873291 92 Absent"

Вуаля!

Отсюда вопрос: Как сохранить xml-файл, чтобы он был уже с пробелами (или отступами)?

Пробовал купить свойство xmlDoc.preserveWhiteSpace = True - не совсем то что нужно. Оно прибавляет отступ, если уже есть пробел или перенос строки (т.е. какой-либо разделитель), а то у меня ничего нет.
...
Рейтинг: 0 / 0
Откуда пробелы в .nodeTypedValue
    #35969998
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказалось я все-таки не одинок в своих проблемах. Как сделать вывод xml-файла в виде дерева с отступами?

Правда ребятам эти отступы для красоты больше, а у меня они на алгоритм импорта дочерних нодов влияет, там мне пробелы-отступы жизненно необходимы.
...
Рейтинг: 0 / 0
Откуда пробелы в .nodeTypedValue
    #35970772
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я делаю так (код на JScript)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
// XML Wrap Utility
// Written by Anton Shchirov

if (WScript.Arguments.length <  1 )
{
   WScript.echo("XML Wrap Utility\n");
   WScript.echo("usage: xmlWrap inputFile");
   WScript.Quit( 1 );
}

try
{
	// attach the schema cache to a DOM
	var xmlSource = new ActiveXObject("MSXML2.DOMDocument.6.0");
	var fso = new ActiveXObject("Scripting.FileSystemObject");
	tf = fso.OpenTextFile(WScript.Arguments.Item( 0 ),  1 );
	s = tf.ReadAll();
	tf.Close();
	s = s.replace(/(\>\<)/g, ">\n<");

	// load XML document
	xmlSource.async = false;
	xmlSource.validateOnParse = false;

	if (xmlSource.loadXML(s)) 
	{
		xmlSource.save(WScript.Arguments.Item( 0 ));
	}
	else 
	{
		WScript.echo("Instance error" );
		WScript.echo("### error: " + xmlSource.parseError.reason);
		WScript.echo("### source: " + xmlSource.parseError.srcText);
		WScript.echo("### line: " + xmlSource.parseError.line);
	}
}

catch ( e )
{
	WScript.echo ( "Exception loading instance document" );
	WScript.echo ( e.description );
}
С уважением, Vasilisk
...
Рейтинг: 0 / 0
Откуда пробелы в .nodeTypedValue
    #35971978
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, спасибо.

Но мне еще хотелось чтобы были древовидные отступы, поэтому я наваял свою процедуру на басике, которая вручную перебирает ноды и вставляет перед каждым отступ с переносом строки в соответствии с его уровнем в дереве

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Private Sub Indent(node, levelIndent As String)
    ' Процедура украшает XML-дерево вставкой отступов
    Dim objNewText, child
          
    ' если нет дочерних нодов, то выходим
    If Not node.hasChildNodes Then Exit Sub
           
    ' перебираем все дочерние ноды и добавляем перед каждым отступ
    Set child = node.FirstChild
    Do Until child Is Nothing
       If child.nodeType =  1  Then
          If Not node.ownerDocument Is Nothing Then
             Set objNewText = node.ownerDocument.createTextNode(levelIndent)
             node.insertBefore objNewText, child
          End If
          ' запускаем рекурсию для дочерних нодов текущего нода
          Indent child, levelIndent & "  "
       End If
       ' переходим к следующему ноду вниз по дереву от текущего
       Set child = child.nextSibling
    Loop
   
End Sub

Использование процедуры простое:
    Set xmlDoc = CreateObject("Microsoft.XMLDOM") 'создаем экземпляр объекта документа
    .....
    ' загружаем файл
    xmlDoc.Load sFileName
    
    ' украшаем дерево xml
    Indent xmlDoc, vbCrLf
    ' сохраняем
    xmlDoc.Save sFileName
...
Рейтинг: 0 / 0
Откуда пробелы в .nodeTypedValue
    #35972501
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс. Забыл про отступ перед закрывающим тегом. Переделал процедуру с учетом этого.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Private Sub Indent(node, levelIndent As String)
    ' Процедура украшает XML-дерево вставкой отступов
    Dim objNewText, child
    Dim bolExit As Boolean
          
    ' если нет дочерних нодов, то выходим
    If Not node.hasChildNodes Then Exit Sub
           
    ' перебираем все дочерние ноды и добавляем перед каждым отступ
    Set child = node.FirstChild
    Do Until child Is Nothing
        
        If child.nodeType =  1  Then
          ' отступ перед открывающим тегом
          If Not node.ownerDocument Is Nothing Then
             Set objNewText = node.ownerDocument.createTextNode(levelIndent)
             node.insertBefore objNewText, child
          End If
          
          ' отступ перед закрывающим тегом
          If child.childNodes.Item( 0 ).nodeType <>  3  Then   ' отступ перед закрывающим тегом Node_Text не нужен
             If Not node.ownerDocument Is Nothing Then
                Set objNewText = node.ownerDocument.createTextNode(levelIndent)
             Else
                Set objNewText = node.createTextNode(levelIndent)
             End If
             child.appendChild (objNewText)
          End If
          
          ' запускаем рекурсию для дочерних нодов текущего нода
          Indent child, levelIndent & "  "
        End If
        
        ' переходим к следующему ноду вниз по дереву от текущего
        Set child = child.nextSibling
    Loop
   
End Sub
...
Рейтинг: 0 / 0
Откуда пробелы в .nodeTypedValue
    #35973179
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeySVНо мне еще хотелось чтобы были древовидные отступы
Мой скрипт именно это и делает. Проверьте
...
Рейтинг: 0 / 0
Откуда пробелы в .nodeTypedValue
    #35974829
Фотография SergeySV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_SergeySVНо мне еще хотелось чтобы были древовидные отступы
Мой скрипт именно это и делает. Проверьте

Да, проверил, работает.
Регулярные выражения - это мое слабое место. Знания ограничивались символьными классами в квадратных скобках, метасимволами * и ?, и квантификаторами в фигурных скобках. Поэтому пока так и не понял, за счет чего вставка ">\n<" дает древовидный отступ.
...
Рейтинг: 0 / 0
Откуда пробелы в .nodeTypedValue
    #35975766
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergeySVПоэтому пока так и не понял, за счет чего вставка ">\n<" дает древовидный отступ.Особенность работы MSXML
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Откуда пробелы в .nodeTypedValue
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]