2009-08-14 2 views
2

У меня есть файл XML, который выглядит какDynamic XML фильтрации и преобразования (в Java)

<?xml version='1.0' encoding='UTF-8'?> 
    <root> 
     <node name="foo1" value="bar1" /> 
     <node name="foo2" value="bar2" /> 
    </root> 

У меня есть метод

String processBar(String bar) 

и я хочу, чтобы в конечном итоге с

<?xml version='1.0' encoding='UTF-8'?> 
    <root> 
     <node name="foo1" value="processBar("bar1")" /> 
     <node name="foo2" value="processBar("bar2")" /> 
    </root> 

Есть ли простой способ сделать это? Предпочтительно в Java. Обратите внимание, что файл слишком велик, чтобы полностью загружать его в память. Данные в XML грубо произвольном и processBar могут быть сложными, поэтому я не хочу использовать регулярные выражения.

+1

Действительно ли вы хотите, чтобы значения атрибута processBar некотировались? –

+0

Я думаю, это непонятно. если processBar ("x") -> "y", то я хочу значение = "y". Но мне не нужна буквальная строка "processBar (\" x \ ")", поэтому я решил написать значение = без кавычек. Надеюсь, что это делает вещи более ясными, спасибо за вопрос. – Jacob

+0

value = "processBar (" bar1 ")" - Кавычки недействительны, как показано. –

ответ

4

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

Используйте JDK-х XSLT API запустить следующее:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:java="http://xml.apache.org/xalan/java" 
       extension-element-prefixes="java"> 
    <xsl:template match="/root/node/@value"> 
    <xsl:attribute name="value"> 
     <xsl:value-of select="java:com.example.yourclass.processBar(string(.))"/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

Это использует Xalan-Java расширения и принимает статический метод. Вы можете получить экземпляр объекта и сохранить его в XSL: переменная, например:

<xsl:variable name="frobber" select="java:com.example.Frobber.new()"/> 
<xsl:value-of select="java:processBar($frobber, string(.))"/> 

Или сконвертировано.

Это работает только с Xalan, но поскольку это XSLT-процессор, распространяемый вместе с JDK, я сомневаюсь, что будет использовать Xalan.

+0

FYI Мне пришлось исправить некоторые ошибки в этом после публикации. Идея звучит, однако. ;) –

+0

Это выглядит великолепно. У вас есть указатели на документацию для синтаксиса ? В частности, мне интересно, какой конструктор используется для создания экземпляра вашего класса и т. Д. – Jacob

+0

Я добавил некоторую информацию в ответ. –

0

вы можете разобрать все это в Java XML парсер или просто получить содержимое файла в строку, а затем сделать регулярное выражение заменить на нем (с использованием т.е. http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29)

+1

Вперед, придумайте регулярное выражение для правильного анализа любого правильно сформированного XML, с учетом неограниченного размещения тегов, блоков CDATA, символов и внешних ссылок, PI, комментариев и т. Д. –

Смежные вопросы