powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите с пространствами имён
14 сообщений из 14, страница 1 из 1
Помогите с пространствами имён
    #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
Помогите с пространствами имён
    #33346294
Наблюдатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты строишь дерево XML в памяти? Самый медленный способ - загрузить пропарсированный XML документ в память, перейти к нужному узлу, прочитать/изменить этот узел (все пространства имен сохранятся!), и записать файл назад...

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

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

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

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

С уважением,
Мартин Рахманов
http://jimmers.russia.webmatrixhosting.net/
...
Рейтинг: 0 / 0
Помогите с пространствами имён
    #33353905
Абориген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да это собственно просто таблица Excel, сохранённая как XML. Вопрос в том, как средствами .NET её редактировать. А точнее, с помощью выражения XPath выбрать какую-нибудь ячейку и поменять её значение. Спасибо.
...
Рейтинг: 0 / 0
Помогите с пространствами имён
    #33353908
Абориген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот например.
...
Рейтинг: 0 / 0
Помогите с пространствами имён
    #33353955
Naug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю как насчёт .NET, а xpath нужно примерно такое:
/Workbook/Worksheet[1]/Table/Row[2]/Cell[1]/Data/text()
(берёт текст первой ячейки второго ряда первого листа)
...
Рейтинг: 0 / 0
Помогите с пространствами имён
    #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
Помогите с пространствами имён
    #33356830
Абориген
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прояснилось. Спасибо.
...
Рейтинг: 0 / 0
Помогите с пространствами имён
    #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
Помогите с пространствами имён
    #33360399
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это есть в msxml, интерфейс IXMLDOMNode.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Помогите с пространствами имён
    #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
14 сообщений из 14, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Помогите с пространствами имён
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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