Получение строк из XML с использованием XPath и Python - PullRequest
0 голосов
/ 20 июля 2009

Я бы хотел получить несколько строк ( z: row row) из XML, используя:

<rs:data>
    <z:row Attribute1="1" Attribute2="1" />
    <z:row Attribute1="2" Attribute2="2" />
    <z:row Attribute1="3" Attribute2="3" />
    <z:row Attribute1="4" Attribute2="4" />
    <z:row Attribute1="5" Attribute2="5" />
    <z:row Attribute1="6" Attribute2="6" />
</rs:data>

У меня проблемы с использованием ( Python ):

ElementTree.parse('myxmlfile.xml').getroot().findall('//z:row')

Я думаю, что в этом случае два пункта неверны.

Кто-нибудь знает, как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 20 июля 2009

Префиксы "z:" представляют пространство имен XML. вам нужно выяснить, что это за пространство имен, и сделать следующее:

XmlDocument doc = new XmlDocument();
doc.Load(@"File.xml");
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("z", @"http://thenamespace.com");
XmlNodeList nodes = doc.SelectNodes(@"//z:row", ns);
1 голос
/ 21 июля 2009

Если я определю пространства имен следующим образом:

<?xml version="1.0"?>
<rs:data xmlns="http://example.com" xmlns:rs="http://example.com/rs" xmlns:z="http://example.com/z">
  <z:row Attribute1="1" Attribute2="1" />
  <z:row Attribute1="2" Attribute2="2" />
  <z:row Attribute1="3" Attribute2="3" />
  <z:row Attribute1="4" Attribute2="4" />
  <z:row Attribute1="5" Attribute2="5" />
  <z:row Attribute1="6" Attribute2="6" />
</rs:data>

Python ElementTree -API можно использовать так:

ElementTree.parse("r.xml").getroot().findall('{http://example.com/z}row')
# => [<Element {http://example.com/z}row at 551ee0>, <Element {http://example.com/z}row at 551c60>, <Element {http://example.com/z}row at 551f08>, <Element {http://example.com/z}row at 551be8>, <Element {http://example.com/z}row at 551eb8>, <Element {http://example.com/z}row at 551f30>]

Смотри также http://effbot.org/zone/element.htm#xml-namespaces

1 голос
/ 20 июля 2009

Если вы не хотите правильно настраивать пространства имен, вы можете игнорировать их следующим образом:

XPathGet("//*[local-name() = 'row']")

, который выбирает каждый узел, имя которого (без пространства имен) равно row.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...