Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите с пространствами имён / 14 сообщений из 14, страница 1 из 1
26.10.2005, 18:38
    #33346020
Абориген
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Имею желание править программно XML, сгенерированный Excel'ем.
Там типа такое:
<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40">
...
<Worksheet ss:Name="Sheet1">
<Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="3" x:FullColumns="1"
x:FullRows="1">
<Column ss:Index="2" ss:AutoFitWidth="0" ss:Width="84"/>
<Column ss:AutoFitWidth="0" ss:Width="76.5"/>
<Row>
<Cell ss:Index="2"><Data ss:Type="String">Проект 1</Data></Cell>
<Cell><Data ss:Type="String">Проект 2</Data></Cell>
<Cell><Data ss:Type="String">Итого</Data></Cell>
</Row>
...

Ну никак у меня не получается выбрать ноду Cell. Убираю пространства имён - всё нормально. Вставляю хоть одно - не работает. Примеры по XmlNamespaceManager применить к данному случаю почему-то не получается. Может кто снизойдёт до меня убогого и напишет, как мне применить XmlElement.SelectNodes(), чтобы выбрать все ячейки в документе?
Спасибо.
...
Рейтинг: 0 / 0
26.10.2005, 21:47
    #33346294
Наблюдатель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
А ты строишь дерево XML в памяти? Самый медленный способ - загрузить пропарсированный XML документ в память, перейти к нужному узлу, прочитать/изменить этот узел (все пространства имен сохранятся!), и записать файл назад...

Либо XmlReader/XmlWriter - намного быстрее, но сложнее обработка
...
Рейтинг: 0 / 0
27.10.2005, 12:22
    #33347232
Абориген
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Об этом тоже можно подумать. Но в данном случае для меня скорость не имеет решающего значения. Важнее удобство программирования.
...
Рейтинг: 0 / 0
28.10.2005, 08:29
    #33349068
Наблюдатель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Абориген, хорошо тебе, раз для тебя важнее удобство программирования ;-) Но именно Excel-файлы в формате XML довольно большие и их парсинг в дерево не очень быстрый.

Лично я для построения дерева в памяти использовал IDOMDocument , и просто перемещался по узлам. Не забывай, что просто по имени Cell ты не можешь обратится, т.к. число узлов с этим именем у узла Row может больше одного, и интерфейс не поймет, какой именно узел тебе нужен, согласен? :-)

Думаю, что тебе нужно просто перебирать узлы Cell , анализировать атрибут ss:Index и уже его значению принимать решение о модификации узла.
...
Рейтинг: 0 / 0
28.10.2005, 11:16
    #33349381
Абориген
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Спасибо, это всё безусловно интересно, но я спрашиваю не о том.
Вопрос, как использовать XmlNamespaceManager и как построить выражение XPath, чтобы выбрать хоть какие-нибудь ноды с помощью SelectNodes().
...
Рейтинг: 0 / 0
31.10.2005, 17:35
    #33353781
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Приветствую

Приведите полный XML файл приложением к сообщению. Я попытаюсь помочь.

С уважением,
Мартин Рахманов
http://jimmers.russia.webmatrixhosting.net/
...
Рейтинг: 0 / 0
31.10.2005, 18:08
    #33353905
Абориген
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Да это собственно просто таблица Excel, сохранённая как XML. Вопрос в том, как средствами .NET её редактировать. А точнее, с помощью выражения XPath выбрать какую-нибудь ячейку и поменять её значение. Спасибо.
...
Рейтинг: 0 / 0
31.10.2005, 18:09
    #33353908
Абориген
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Вот например.
...
Рейтинг: 0 / 0
31.10.2005, 18:29
    #33353955
Naug
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
не знаю как насчёт .NET, а xpath нужно примерно такое:
/Workbook/Worksheet[1]/Table/Row[2]/Cell[1]/Data/text()
(берёт текст первой ячейки второго ряда первого листа)
...
Рейтинг: 0 / 0
31.10.2005, 19:14
    #33354047
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Собственно, верно заметил предыдущий оратор - XPath будет такой:

Код: plaintext
/Workbook/Worksheet/Table/Row/Cell

Соответственно, код на C# для выборки:

Код: 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.
using System;
using System.Xml;

namespace DumpCells
{
    class Program
    {
        static void Main(string[] args)
        {
            string xmlFile = @"..\..\Book1.xml";
            XmlDocument xmlDocument = new XmlDocument();
            xmlDocument.Load(xmlFile);
            XmlTextReader xmlTextReader = new XmlTextReader(xmlFile);
            XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(xmlTextReader.NameTable);

            xmlNamespaceManager.AddNamespace("default_ns", "urn:schemas-microsoft-com:office:spreadsheet");
            xmlNamespaceManager.AddNamespace("x", "urn:schemas-microsoft-com:office:excel");
            xmlNamespaceManager.AddNamespace("ss", "urn:schemas-microsoft-com:office:spreadsheet");

            XmlNodeList xmlNodes = xmlDocument.SelectNodes("/default_ns:Workbook/ss:Worksheet/ss:Table/default_ns:Row/ss:Cell", xmlNamespaceManager);
            for (int i =  0 ; i < xmlNodes.Count; i++)
            {
                Console.WriteLine("InnerText: {0}", xmlNodes[i].ChildNodes[ 0 ].InnerText);                
            }
        }
    }
}
...
Рейтинг: 0 / 0
02.11.2005, 10:43
    #33356830
Абориген
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Прояснилось. Спасибо.
...
Рейтинг: 0 / 0
02.11.2005, 19:10
    #33358683
ежемуха
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Ух ты!

А в DOM такая штука разве есть?

Код: plaintext
1.
2.
XmlNodeList xmlNodes = xmlDocument.SelectNodes
("/default_ns:Workbook/ss:Worksheet/ss:Table/default_ns:Row/ss:Cell", 
xmlNamespaceManager);

У меня java, jaxp. Что-то я там не нахожу метода, который принимал бы xPath...
...
Рейтинг: 0 / 0
03.11.2005, 15:16
    #33360399
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
это есть в msxml, интерфейс IXMLDOMNode.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
03.11.2005, 17:57
    #33360952
jimmers
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с пространствами имён
Сразу оговорюсь, что я не силён в Java. Но такой код будет работать:

Код: 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.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
import java.util.Iterator;
import javax.xml.xpath.*; // for XPath, XPathFactory
import javax.xml.namespace.*;
import javax.xml.*;
import org.w3c.dom.NodeList; // for NodeList
import org.xml.sax.*; // for InputSource

class MyNamespaceContext implements NamespaceContext
{
	public String getNamespaceURI(String prefix)
	{
		if (prefix.equals("x"))
			return "urn:schemas-microsoft-com:office:excel";
		else if (prefix.equals("o"))
			return "urn:schemas-microsoft-com:office:office";
		else if (prefix.equals("ss"))
			return "urn:schemas-microsoft-com:office:spreadsheet";
		else if (prefix.equals("html"))
			return "http://www.w3.org/TR/REC-html40";
		else
			return "urn:schemas-microsoft-com:office:spreadsheet";
	}

	public String getPrefix(String namespace)
	{
		if (namespace.equals("urn:schemas-microsoft-com:office:excel"))
			return "x";
		else if (namespace.equals("urn:schemas-microsoft-com:office:office"))
			return "o";
		else if (namespace.equals("urn:schemas-microsoft-com:office:spreadsheet"))
			return "ss";
		else if (namespace.equals("http://www.w3.org/TR/REC-html40"))
			return "html";
		else
			return null;
	}

	public Iterator getPrefixes(String namespace)
	{
		return null;
	}
}  

public class sample
{
	public static void main(String[] args) throws XPathExpressionException
	{
		XPath xpath = XPathFactory.newInstance().newXPath();
		String expression = "/default_ns:Workbook/ss:Worksheet/ss:Table/default_ns:Row/ss:Cell";
		InputSource inputSource = new InputSource("Book1.xml");
		xpath.setNamespaceContext(new MyNamespaceContext());
		NodeList nodes = (NodeList)xpath.evaluate(expression, inputSource, XPathConstants.NODESET);
		for (int i =  0 ; i < nodes.getLength(); i++)
		{
			System.out.println(nodes.item(i).getTextContent());
		}
	}
}
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите с пространствами имён / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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