Вопрос следующий. Можно ли придумать некий формат образцов (паттернов) для разбора (декомпозиции) ХМЛ лучший чем XPath?
Суть такая. Предположим что нам нужно разобрать ХМЛ-файл в некотором языке программирования. В этом языке сопоставление с образцом (ну, или просто switch, для тех кто не знаком с этой техникой) которое позволяет в качестве образца использовать нечто что позволяет легко распознать фрагмент ХМЛ-я. Например, так:
match (someXmlDom)
{
| //oprders/$order[@id=123] => WriteLine(order.Customer)
...
}
Можно придумать что-то более удобное нежели XPath?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Вопрос следующий. Можно ли придумать некий формат образцов (паттернов) для разбора (декомпозиции) ХМЛ лучший чем XPath?
Лучший по каким признакам?
Linq2Xml, например, позволяет строить достаточные удобные запросы относительно типизированной модели, если XSD схема известна заранее. То что неудобно — по XSD схеме приходится генерить/обновлять C# классы несколько в стороне.
Если Nemerle сможет прожевывать схему XSD на лету и выдавать intellisense + проверку кейзов матчинга на лету по схеме во время компиляции — будет круто, че
Здравствуйте, VladD2, Вы писали:
VD>Всем привет!
VD>Вопрос следующий. Можно ли придумать некий формат образцов (паттернов) для разбора (декомпозиции) ХМЛ лучший чем XPath?
CSS selectors вестимо. Здесь вот список наиболее популярных конструкций.
VD>Суть такая. Предположим что нам нужно разобрать ХМЛ-файл в некотором языке программирования. В этом языке сопоставление с образцом (ну, или просто switch, для тех кто не знаком с этой техникой) которое позволяет в качестве образца использовать нечто что позволяет легко распознать фрагмент ХМЛ-я. Например, так: VD>
Здравствуйте, Кэр, Вы писали:
Кэр>Я что-то пропустил?
CSS selectors имеют значительно более простой синтаксис. В случае встраивания в язык в виде match() например
это плюс. И опять же если говорить про встраиваемость то полный набор фич XPath никому не нужен (в контексте данного обсуждения).
Что-то явно придется выкидывать. И моя пятая точка мне говорит что в конце концов все сведется к набору фич CSS selectors.
Всякие там expressions значительно эффективнее делать в host language например. А тогда зачем XPath?
Ну и потом... XPath это про XML только. CSS selectors же в принципе расширяемые, например список :runtime-flags .
Скажем for(var in $$(link[href]:visited)) может быть применима к живому дереву объектов (скажем XAML) и
для получения значения runtime флага :visited вызвать visited {get ... } property.
Здравствуйте, c-smile, Вы писали:
CS>CSS selectors вестимо. CS>Здесь вот список наиболее популярных конструкций.
Тут вот какая закавыка. Что XPath, что CSS selectors — это языки задающие условия поиска, а у паттерн-матчинга это не единственная задача. Паттерн-матчинг кроме этого еще представляет средство декомпозиции структур данных (в нашем случае ХМЛ-я, точнее того формата в котором ХМЛ представляется внутри памяти).
И тут я не вижу как CSS selectors или XPath могут помочь в данном случае.
Возможно в качестве паттернов можно было использовать сам ХМЛ, например:
match (someXml)
{
| xml <#
<Item PartNumber=$partNum>
<ProductName>$name</ProductName>
<Quantity>$(qty : int)</Quantity>
<USPrice>$(price : double)</USPrice>
</Item> #> when partNum == x => Используем name, qty и price
...
Но встает вопрос как быть со списками элементов (когда подэлементов большее одного) и вообще семантику придется продумывать по полной программе.
Может быть уже что-то подобное есть?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Возможно в качестве паттернов можно было использовать сам ХМЛ, например: VD>
VD>match (someXml)
VD>{
VD> | xml <#
VD> <Item PartNumber=$partNum>
VD> <ProductName>$name</ProductName>
VD> <Quantity>$(qty : int)</Quantity>
VD> <USPrice>$(price : double)</USPrice>
VD> </Item> #> when partNum == x => Используем name, qty и price
VD> ...
VD>
VD>Но встает вопрос как быть со списками элементов (когда подэлементов большее одного) и вообще семантику придется продумывать по полной программе.
VD>Может быть уже что-то подобное есть?
Здравствуйте, VladD2, Вы писали:
VD>Тут вот какая закавыка. Что XPath, что CSS selectors — это языки задающие условия поиска, а у паттерн-матчинга это не единственная задача. Паттерн-матчинг кроме этого еще представляет средство декомпозиции структур данных (в нашем случае ХМЛ-я, точнее того формата в котором ХМЛ представляется внутри памяти).
[...] VD>Может быть уже что-то подобное есть?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, c-smile, Вы писали:
CS>>CSS selectors вестимо. CS>>Здесь вот список наиболее популярных конструкций.
VD>Тут вот какая закавыка. Что XPath, что CSS selectors — это языки задающие условия поиска, а у паттерн-матчинга это не единственная задача. Паттерн-матчинг кроме этого еще представляет средство декомпозиции структур данных (в нашем случае ХМЛ-я, точнее того формата в котором ХМЛ представляется внутри памяти).
VD>И тут я не вижу как CSS selectors или XPath могут помочь в данном случае.
VD>Возможно в качестве паттернов можно было использовать сам ХМЛ, например: VD>
VD>match (someXml)
VD>{
VD> | xml <#
VD> <Item PartNumber=$partNum>
VD> <ProductName>$name</ProductName>
VD> <Quantity>$(qty : int)</Quantity>
VD> <USPrice>$(price : double)</USPrice>
VD> </Item> #> when partNum == x => Используем name, qty и price
VD> ...
VD>
VD>Но встает вопрос как быть со списками элементов (когда подэлементов большее одного) и вообще семантику придется продумывать по полной программе.
Как-то все это нетривиально. Т.е. вероятность [толкового] использования этого дела крайне низка.
В реалии чего-то такого вот:
var item = $(item[PartNumber={x}]);
try {
var name = item.$(ProductName).text;
var qty = item.$(Quantity).text.toInteger();
var price = item.$(USPrice).text.toFloat();
... Используем name, qty и price ...
} catch(e) {}
вполне себе достаточно. По эффективности — то же самое. Зато не надо лишних абстракций, ни в runtime ни в компиляторе.
И вычислительная сложность предсказуема. CSS selectors имеют сложность O(N*D) — N — количесство DOM элементов, D — глубина дерева.
Здравствуйте, Кэр, Вы писали:
VD>>Вопрос следующий. Можно ли придумать некий формат образцов (паттернов) для разбора (декомпозиции) ХМЛ лучший чем XPath?
Кэр>Лучший по каким признакам?
По критерию удобства использования.
Кэр>Linq2Xml, например, позволяет строить достаточные удобные запросы относительно типизированной модели, если XSD схема известна заранее. То что неудобно — по XSD схеме приходится генерить/обновлять C# классы несколько в стороне.
Что-то я не слышал о том, что Linq to Xml использовал бы XSD. Можно ссылочку объясняющую о чем идет речь? Может речь о неком отдельном проекте?
Кэр>Если Nemerle сможет прожевывать схему XSD на лету и выдавать intellisense + проверку кейзов матчинга на лету по схеме во время компиляции — будет круто, че
Сделать то можно все что угодно. Вопрос только во времени которое нужно потратить и в конечном результате.
Собственно сейчас речь идет о совершенно ином. Видимо ты не знаком с тем, что такое сопоставление с образцом. Потому и говоришь о чем-то отвлеченном.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
An XML pattern looks just like an XML literal. The main difference is
that if you insert a {} escape, then the code inside the {} is not an expression
but a pattern. A pattern embedded in {} can use the full Scala pattern language,
including binding new variables, performing type tests, and ignoring
content using the _ and _* patterns.
You can match against a sequence of nodes instead of a single one. The pattern for “any
sequence” of XML nodes is written ‘_*’. Visually, this sequence looks like
the wildcard pattern (_) followed by a regex-style Kleene star (*).
def proc(node: scala.xml.Node): String = node match {
case <a>{contents @ _*}</a> => "It's an a: "+ contents
case <b>{contents @ _*}</b> => "It's a b: "+ contents
case _ => "It's something else."
}
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, c-smile, Вы писали:
CS>>"Эта реалия похожа на грязь." да?
VD>Ага. Как-то все это нетривиально. Т.е. вероятность [толкового] использования этого дела крайне низка.