/ItemLookupResponse /ItemLookupResponse/OperationRequest /ItemLookupResponse/OperationRequest/HTTPHeaders /ItemLookupResponse/OperationRequest/RequestId /ItemLookupResponse/OperationRequest/Arguments /ItemLookupResponse/OperationRequest/RequestProcessingTime /ItemLookupResponse/OperationRequest/HTTPHeaders/Header /ItemLookupResponse/OperationRequest/Arguments/Argument[1] /ItemLookupResponse/OperationRequest/Arguments/Argument[1] /ItemLookupResponse/OperationRequest/Arguments/Argument[1] /ItemLookupResponse/OperationRequest/Arguments/Argument[1] /ItemLookupResponse/OperationRequest/Arguments/Argument[1] /ItemLookupResponse/OperationRequest/Arguments/Argument[1] /ItemLookupResponse/OperationRequest/Arguments/Argument
pathが重複している。
def xpath
path_elements = []
cur = self
path_elements << __to_xpath_helper( self )
while cur.parent
cur = cur.parent
path_elements << __to_xpath_helper( cur )
end
return path_elements.reverse.join( "/" )
end
pathの各要素は __to_xpath_helperで取ってきている。
def __to_xpath_helper node
rv = node.expanded_name
if node.parent
results = node.parent.find_all {|n|
n.kind_of?(REXML::Element) and n.expanded_name == node.expanded_name
}
if results.length > 1
idx = results.index( node )
rv << "[#{idx+1}]"
end
end
rv
end
node.expanded_nameを破壊的に変更している。("Argument" -> "Argument[1]")
D:\ruby\lib\ruby\1.8\rexml>diff -u element.rb~ element.rb
--- element.rb~ 2005-08-12 21:08:47.000000000 +0900
+++ element.rb 2006-06-27 00:36:58.546875000 +0900
@@ -720,7 +720,8 @@
}
if results.length > 1
idx = results.index( node )
- rv << "[#{idx+1}]"
+ rv += "[#{idx+1}]"
end
end
rv
/ItemLookupResponse /ItemLookupResponse/OperationRequest /ItemLookupResponse/OperationRequest/HTTPHeaders /ItemLookupResponse/OperationRequest/RequestId /ItemLookupResponse/OperationRequest/Arguments /ItemLookupResponse/OperationRequest/RequestProcessingTime /ItemLookupResponse/OperationRequest/HTTPHeaders/Header /ItemLookupResponse/OperationRequest/Arguments/Argument[1] /ItemLookupResponse/OperationRequest/Arguments/Argument[2] /ItemLookupResponse/OperationRequest/Arguments/Argument[3] /ItemLookupResponse/OperationRequest/Arguments/Argument[4] /ItemLookupResponse/OperationRequest/Arguments/Argument[5] /ItemLookupResponse/OperationRequest/Arguments/Argument[6] /ItemLookupResponse/OperationRequest/Arguments/Argument[7]
をを、直っている。というわけで上記は ruby-1.8.4に付随する REXML 3.1.3限定の話でした。
def __to_xpath_helper node
rv = node.expanded_name.clone
if node.parent
results = node.parent.find_all {|n|
n.kind_of?(REXML::Element) and n.expanded_name == node.expanded_name
}
if results.length > 1
idx = results.index( node )
rv << "[#{idx+1}]"
end
end
rv
end
3.1.3 からの ChangeLog。(そのうち 3.1.4からの ChangeLogになりそう)
間に合わせにこんなのを紛れ込ませる。
if(::REXML::Version < '3.1.4')
module ::REXML
class Element
def __to_xpath_helper node
rv = node.expanded_name.clone
if node.parent
results = node.parent.find_all {|n|
n.kind_of?(REXML::Element) and n.expanded_name == node.expanded_name
}
if results.length > 1
idx = results.index( node )
rv << "[#{idx+1}]"
end
end
rv
end
end
end
end