我不经常使用XML,也从未使用过XPath。我试图使用XPath解析使用python / lxml的xml文档。 lxml依赖于libxml2,因此我无法访问XPath 2.0功能。我试图使用没有包含名称空间的客户端提供的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>
我需要能够抓住这些元素而不必在可能的情况下修改XPath。
到目前为止我发现似乎建议即使命名空间只在父元素上显式指定,我需要指定是否为路径中的每个子节点,使我的客户端提供的路径仅在我可用时才可用处理它们以在每个元素之前包含命名空间。
这是正确的还是有一种更清洁的方式?这让我觉得一团糟:如果孩子们没有明确地分配给他们的命名空间,为什么XPath 有来明确它呢?
我认为我错过了一些东西。
答案 0 :(得分:0)
您还没有充分说明您的技术限制。如果您能够使用XPath 2.0处理器,那么您应该能够为元素和类型定义&#34;默认命名空间&#34;如urn:CREA.Search.Property
和使用未加前缀的名称(如Building/SizeInterior
)的路径,则将元素名称视为在此命名空间中。
(XPath没有将n:aaa/bbb
视为含义n:aaa/n:bbb
的原因是,作为一个孩子拥有无命名空间元素bbb
是非常合理的命名空间元素n:aaa
)。