LINUX.ORG.RU

[java] нужен XML Parser/XPath

 


0

1

с помощью которого было бы максимально удобно и некриво из

<string>some <b attr="val">te</b> xt</string>
получить
some <b attr="val">te</b> xt

если можно сделать через XPath - тоже не откажусь от помощи :)

★★★★

На Scala легко:

data match {
  case <string>{content @ _*}</string> => content
}

Небольшая проблема в том, что рантайм Scala 2.8.1 без прохождения ProGuard'ом занимает 6344 кб :)

dave ★★★★★
()
Ответ на: комментарий от MKuznetsov

такое не вытащит <b attr=«val»>, проверял уже

thevery ★★★★
() автор топика
Ответ на: комментарий от thevery

простенькую машину состояний, наваять, шобы учитывать вложенность, ковычки cdata и прочие особеннгости

wfrr ★★☆
()
Ответ на: комментарий от wfrr

нафиг-нафиг, я ж просил максимально просто

thevery ★★★★
() автор топика
Ответ на: комментарий от anonymous

всё, что внутри - «string1<string>string2</string>string1»

thevery ★★★★
() автор топика
Ответ на: комментарий от thevery

Вернется содержимое внешнего тега в виде коллекции типа NodeSeq:

Welcome to Scala version 2.8.1.final (Java HotSpot(TM) Client VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def extract(x: xml.Node): xml.NodeSeq = x match {
     |   case <string>{content @ _*}</string> => content
     | }
extract: (x: scala.xml.Node)scala.xml.NodeSeq

scala> val x = <string>string1<string>string2</string>string1</string>
x: scala.xml.Elem = <string>string1<string>string2</string>string1</string>

scala> extract(x)
res0: scala.xml.NodeSeq = NodeSeq(string1, <string>string2</string>, string1)
dave ★★★★★
()

в итоге решил свою задачу чуть иначе через XSLT. если кому интересно, это нужно было для перевода андроидовских строчек, которые имеют формат

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SPB TV</string>
    <string name="yes">yes</string>
</resources>
решил через xslt-преобразование, которое merge'ит исходную xml'ку и перевод в формате
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string>
        <src>SPB TV</src>
        <dst>СПБ ТВ</dst>
    </string>    
</resources>
само преобразование выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
    <xsl:variable name="with" select="'translation.xml'"/>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/resources/string">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:variable name="info"
                          select="document($with)/resources/string[src/node()=current()/node()]/."/>
            <xsl:choose>
                <xsl:when test="$info">
                    <xsl:copy-of select="$info/dst/node()"/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:copy-of select="current()/node()"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>

</xsl:transform>

thevery ★★★★
() автор топика
Ответ на: комментарий от annulen

притом что строчки для перевода проще и удобнее подсовывать по одной, а не генерить предварительно ещё одну XML'ку

thevery ★★★★
() автор топика
Ответ на: комментарий от dave

>На Scala легко

твой мозг в принципе способен осознать, почему regular expressions cannot into XML?

anonymous
()
Ответ на: комментарий от wfrr

Подозреваю, что это не сколько XSLT сколько автор…

Deleted
()
Ответ на: комментарий от wfrr

ну, этот-то код проще некуда, но программирование на XSLT - зло, это факт :(

thevery ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.