Заменить текстовый узел XML на узел элемента

1

Я использую groovy, поэтому реализация Java также будет прекрасной.

у меня есть

"""<TextFlow fontFamily="Arial" fontSize="20"><span>before</span>Less than 7 days<span>after</span></TextFlow>"""

Я хотел бы обернуть текстовый узел первого уровня тегом. Поэтому я хотел бы получить

"""<TextFlow fontFamily="Arial" fontSize="20"><span>before</span><span>Less than 7 days</span><span>after</span></TextFlow>"""

Я просмотрел XmlSlurper, который не имеет дело с текстовыми узлами. Я также рассмотрел XmlParser, который может обрабатывать текстовые узлы, но я не уверен, как заменить его на элемент xml. Пожалуйста посоветуй.

Теги:
groovy

1 ответ

1
Лучший ответ

Это сработало для меня, надеюсь, что это поможет кому-то еще

@Grab('org.jdom:jdom2:2.0.5')
@Grab('jaxen:jaxen:1.1.4')
@GrabExclude('jdom:jdom')

import org.jdom2.*
import org.jdom2.input.*
import org.jdom2.xpath.*
import org.jdom2.output.*

def xml = """<TextFlow fontFamily="Arial" fontSize="20"><span>before</span>Less than 7 days<span>after</span></TextFlow>"""

Document doc = new SAXBuilder().build(new StringReader(xml)) 
def urls = XPathFactory.instance().compile('//TextFlow/text()').evaluate(doc)

for(def c in urls) {
    int pos = c.parent.content.indexOf(c)    
    Element span = new Element("span")
    span.text = c.text
    c.parent.setContent(pos, span)

}

new XMLOutputter().with {
  format = Format.getRawFormat()
  format.setLineSeparator(LineSeparator.NONE)
  // XmlOutputter can write to OutputStream or Writer, which is sufficient for most cases
  output(doc, System.out)
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню