2016-07-20 3 views
0

Я часто не работаю с XML и никогда не использовал XPath. Я пытаюсь проанализировать XML-документ, используя python/lxml, используя XPath. lxml полагается на libxml2, и поэтому у меня нет доступа к функциям XPath 2.0. Я пытаюсь сделать это, используя список XPaths, предоставленный клиентом, который не содержит пространств имен.Выбор дочернего узла XPath без родительского пространства имен

Это для ответа сервера RETS от Канадской ассоциации недвижимости, если это помогает. Их документация здесь: http://www.crea.ca/wp-content/uploads/2016/02/DDFDataFeedTechnicalDoc-2016-3.pdf

Дорожки отформатированы как и (гораздо больше есть из них) следующее:

Building/SizeInterior 
Land/SizeTotal 

Родительский элемент имеет пространство имен «urn:CREA.Search.Property», как показано на следующем примере ответ:

<?xml version="1.0" encoding="UTF-8"?> 
<RETS ReplyCode="0" ReplyText="Operation successful"> 
    <COUNT Records="1" /> 
    <RETS-RESPONSE xmlns="urn:CREA.Search.Property"> 
     <Pagination> 
     <TotalRecords>1</TotalRecords> 
     <Limit>100</Limit> 
     <Offset>1</Offset> 
     <TotalPages>1</TotalPages> 
     <RecordsReturned>1</RecordsReturned> 
     </Pagination> 
     <PropertyDetails ID="XXXXXXXXXX" LastUpdated="Sun, 12 Jun 2016 14:21:20 GMT"> 
     <Building> 
      <SizeInterior /> 
      <Type>No Building</Type> 
      <UtilityWater>Private Utility</UtilityWater> 
     </Building> 
     <Land> 
      <SizeTotal>0.28 ac|under 1 acre</SizeTotal> 
      <SizeTotalText>0.28 ac|under 1 acre</SizeTotalText> 
      <AccessType>Easy access</AccessType> 
      <Acreage>false</Acreage> 
      <SizeIrregular>0.28</SizeIrregular> 
     </Land> 
     </PropertyDetails> 
    </RETS-RESPONSE> 
</RETS> 

Мне нужно уметь захватить эти элементы без необходимости изменять XPaths, если это возможно.

То, что я нашел до сих пор, кажется, предполагает, что даже если пространство имен явно указано в родительском элементе, мне нужно указать, будет ли для каждого дочернего элемента пути путь, предоставляемый моим клиентом, только пригодным для использования, если Я обрабатываю их для включения пространства имен перед каждым элементом.

Это правильно или есть способ, который был бы чище? Это поражает меня как беспорядочный: если у детей нет явно заданного им пространства имен, почему бы XPath иметь, чтобы быть в явном виде об этом?

Я предполагаю, что у меня что-то не хватает.

+0

Элементы наследуют пространство имен от их родителей. – choroba

+0

@choroba, я знаю. Я не понимаю, почему унаследованное пространство имен должно быть объявлено для каждого дочернего элемента в XPath. Поскольку мы знаем, что пространства имен наследуются в документе, почему я не могу указать путь, в котором родительский элемент включает пространство имен, а дети не имеют (т. Е. Xpath предполагает наследование). Из того, что я могу найти в Интернете, кажется, что это невозможно, но это кажется мне странным. Поэтому я решил, что спрошу. – raphaeltm

+0

Возможно: ''. Теперь '// c' находит' c', даже если пространство имен его родителя 'n'. – choroba

ответ

0

Вы не много говорили о своих технологических ограничениях. Если вы можете использовать процессор XPath 2.0, то вы должны иметь возможность определить «пространство имен по умолчанию для элементов и типов» как urn:CREA.Search.Property, а также пути с использованием неподписанных имен, например Building/SizeInterior, а затем обрабатывать имена элементов как находящиеся в этом пространстве имен.

(Причина, по которой XPath не рассматривает n:aaa/bbb как смысл n:aaa/n:bbb, что это вполне законно, чтобы иметь не-имен элемент bbb как дочерний элемент Namespaced элемента n:aaa).

+0

Я очень волновался о вашем ответе, а потом понял, что я использую lxml, который полагается на libxml2, который не поддерживает XPath 2.0. Я добавлю это к исходному вопросу. – raphaeltm

Смежные вопросы