Как я могу определить количество
есть "неизвестные" поля?
Это выражение XPath :
count(/*/*/*)
вычисляет число элементов, которые являются дочерними для элементов, которые являются дочерними элементами верхнего узла XML-документа - именно то, что требуется в этом случае.
Если у элемента "Row"
могут быть дочерние элементы, имя которых не начинается с "UnknownCol",
тогда это выражение XPath предоставляет количество элементов, чье имя начинается с "UnknownCol" и которые являются дочерними элементами элементов, которые являются дочерними элементами верхнего элемента:
count(/*/*/*[starts-with(name(), "UnknownCol")])
Если у верхнего элемента могут быть другие дочерние элементы, отличные от "Row"
, то выражение XPath, дающее необходимое количество, будет:
count(/*/Row/*[starts-with(name(), "UnknownCol")])
Кроме того, как я могу прочитать атрибуты,
если есть, для неизвестных полей?
Зная XPath:)
/*/Row/*[starts-with(name(), "UnknownCol")]/@*
выбирает все атрибуты всех элементов "UnknownCol" {String}
Это выражение XPath дает нам количество этих атрибутов:
count(/*/Row/*[starts-with(name(), "UnknownCol")]/@*)
Это выражение Xpath дает нам имя k-го такого атрибута ($ ind должно быть установлено в число k):
name( (/*/Row/*[starts-with(name(), "UnknownCol")]/@*)[$ind] )
И, наконец, это выражение XPath создает значение k-го такого атрибута:
string( (/*/Row/*[starts-with(name(), "UnknownCol")]/@*)[$ind] )
Редактировать: ОП отметил, что он полностью не знает имен дочернего элемента .
Исправить несложно: просто удалите предикат из всех выражений:
count(/*/*/*)
count(/*/Row/*)
/*/Row/*/@*
count(/*/Row/*/@*)
name( (/*/Row/*/@*)[$ind] )
string( (/*/Row/*/@*)[$ind] )