Здравствуйте, 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>Может быть уже что-то подобное есть?
Здравствуйте, Кэр, Вы писали:
Кэр>Я что-то пропустил?
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.
Здравствуйте, 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 — глубина дерева.
Вопрос следующий. Можно ли придумать некий формат образцов (паттернов) для разбора (декомпозиции) ХМЛ лучший чем 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>
Здравствуйте, 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
...
Но встает вопрос как быть со списками элементов (когда подэлементов большее одного) и вообще семантику придется продумывать по полной программе.
Может быть уже что-то подобное есть?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Кэр, Вы писали:
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>Ага. Как-то все это нетривиально. Т.е. вероятность [толкового] использования этого дела крайне низка.
Здравствуйте, VladD2, Вы писали:
Кэр>>Лучший по каким признакам? VD>По критерию удобства использования.
Офигительный критерий Любой инструмент будучи заточен на удобство для решения одних задач оказывается неудобен для решения других задач. Не бывает просто абстрактного удобства.
Кэр>>Linq2Xml, например, позволяет строить достаточные удобные запросы относительно типизированной модели, если XSD схема известна заранее. То что неудобно — по XSD схеме приходится генерить/обновлять C# классы несколько в стороне.
VD>Что-то я не слышал о том, что Linq to Xml использовал бы XSD. Можно ссылочку объясняющую о чем идет речь? Может речь о неком отдельном проекте?
Из беты они правда так и не вышли еще.
Кэр>>Если Nemerle сможет прожевывать схему XSD на лету и выдавать intellisense + проверку кейзов матчинга на лету по схеме во время компиляции — будет круто, че VD>Сделать то можно все что угодно. Вопрос только во времени которое нужно потратить и в конечном результате.
Да я и не настаиваю
VD>Собственно сейчас речь идет о совершенно ином. Видимо ты не знаком с тем, что такое сопоставление с образцом. Потому и говоришь о чем-то отвлеченном.
Я говорю о том, чтобы в некоторых случах писать строго-типизированные паттерны. Но пусть будет, что я не знаком с паттерн-матчингом — я опять же не настаиваю
Вот, кстати (уз извиняюсь за упоминание Немерла), но если бы эту фичу писали на Немерле, то она давно была бы зарелизена. Как раз для подобных задач макросы — это самое удобное средство реализации.
VD>>Собственно сейчас речь идет о совершенно ином. Видимо ты не знаком с тем, что такое сопоставление с образцом. Потому и говоришь о чем-то отвлеченном.
Кэр>Я говорю о том, чтобы в некоторых случах писать строго-типизированные паттерны. Но пусть будет, что я не знаком с паттерн-матчингом — я опять же не настаиваю
Кстати, очень советую познакомиться с паттерн-матчингом. Весьма интересная штука.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Вот, кстати (уз извиняюсь за упоминание Немерла), но если бы эту фичу писали на Немерле, то она давно была бы зарелизена. Как раз для подобных задач макросы — это самое удобное средство реализации.
Когда, кстати, Немерле релизит первую версию? А то бету Linq2Xsd качать тоже можно и пользоваться. Просто статус у нее официальный бета.
VD>Кстати, очень советую познакомиться с паттерн-матчингом. Весьма интересная штука.
Я согласен интересная Я только не понимаю, почему ты решил, что типизация в написании паттернов для матчинга означает, что я не понимаю паттерн-матчинг
можно скомбинировать XSLT с обычным кодом. Первая стадия пайплайна делает XSLT преобразование, генерирующее простой текст в нужном формате. Вторая стадия легко парсит его и делает что надо.
Здравствуйте, Кэр, Вы писали:
Кэр>Когда, кстати, Немерле релизит первую версию? А то бету Linq2Xsd качать тоже можно и пользоваться. Просто статус у нее официальный бета.
Бэта 2 опубликована буквально только что. Изменений уже практически не будет. Теперь будут только вычищать баги которых и так не очень много. В основном баги сосредоточены в поддержке IDE. Так что на стабильность компилятора они не влияют. А релиз будет как только дочистим баги. Если все пойдет хорошо, то через месяц где-то.
VD>>Кстати, очень советую познакомиться с паттерн-матчингом. Весьма интересная штука.
Кэр>Я согласен интересная Я только не понимаю, почему ты решил, что типизация в написании паттернов для матчинга означает, что я не понимаю паттерн-матчинг
Ты вроде бы сам сказал об этом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Бэта 2 опубликована буквально только что. Изменений уже практически не будет. Теперь будут только вычищать баги которых и так не очень много. В основном баги сосредоточены в поддержке IDE. Так что на стабильность компилятора они не влияют. А релиз будет как только дочистим баги. Если все пойдет хорошо, то через месяц где-то.
Это интересно.
VD>Ты вроде бы сам сказал об этом.
Я не стал тебе доказывать, что я знаю его, ибо смысла в этом мало