Попробуйте использовать подстановочный знак для пространства имен, например *:
<cfdump var="#XmlSearch(parsedXML, '//*:Polygon')#">
... или
<cfdump var="#XmlSearch(parsedXML, '//*:MultiSurface/*:surfaceMembers/*:Polygon')#">
Объяснение:
Я предполагаю, что вы являетесь потребителем XML и не можете его изменить. Проблема здесь заключается в том, что родительский элемент содержит объявление пространства имен, т.е.
<MultiSurface xmlns="http://www.opengis.net/gml">
Однако текущее поисковое выражение предназначено для элемента без , т.е.
<MultiSurface>
Объявленное пространство имен применяется к элементу MultiSurface и его потомкам. Так что на него нужно ссылаться в любых поисковых выражениях, чтобы идентифицировать эти элементы. Обычно объявления пространства имен содержат префикс: xmlns:prefix="http://example.com/widget"
. Префикс затем используется как своего рода сокращение при ссылке на элементы, то есть prefix:ElementName
. В этом случае префикса нет, и элементы оказываются в некотором неименованном пространстве. Таким образом, ваши поисковые выражения должны ссылаться на него другими способами, такими как
подстановочные знаки
xmlSearch(parsedXML, "//*:MultiSurface")
local-name ()
xmlSearch(parsedXML, "/*[local-name()='MultiSurface']")
namespace-uri ()
xmlSearch(parsedXML, "/*[local-name()='MultiSurface'
and namespace-uri() = 'http://www.opengis.net/gml']")
У каждого метода есть свои плюсы и минусы. Методы № 1 и № 2 подходят для простых схем и находят соответствующие элементы в любом пространстве имен. Для более сложных схем, имеющих одинаковые элементы, определенные в нескольких пространствах имен, для устранения неоднозначности требуется метод № 3.