Может ли Apache XMLBeans читать и вставлять неполный XML-документ (фрагмент) в XML-документ?

Предположим, что у меня есть что-то вроде этого:

FooDocument fooDoc = FooDocument.Factory.newInstance();
fooDoc.addNewBar();

Если бы я создал строку для представления fooDoc, она выглядела бы примерно так:

<?xml version="1.0" encoding="utf-8"?>
<Foo>
    <Bar/>
</Foo>

Теперь предположим, что у меня есть файл, содержащий только это:

<Bar/>

И вместо того, чтобы программно добавлять Bar в качестве дочернего элемента Foo, я хотел прочитать файл и добавить содержимое файла в fooDoc, примерно так:

FooDocument fooDoc = FooDocument.Factory.newInstance();
Bar bar = Bar.Factory.parse("file-containing-bar");
fooDoc.add(bar);

Возможно ли это сделать с помощью XML Beans? Очевидно, что файл, содержащий только узел Bar, не является файлом XML.


person Greg Mattes    schedule 16.01.2014    source источник
comment
Хм, почему файл, содержащий только узел Bar, а не узел, является файлом XML? Преамбула XML не является обязательной. Если разметка в файле содержит один корневой узел, а также представляет собой правильно сформированный XML… почему нельзя загрузить ее отдельно?   -  person rec    schedule 18.01.2014
comment
Узел Bar не является корневым узлом в схеме Foo, Foo является корневым узлом.   -  person Greg Mattes    schedule 21.01.2014
comment
Файл, содержащий узел Bar, представляет собой XML-файл, просто он не соответствует схеме. Вы смотрели на XmlCursor, чтобы сделать это? xmlbeans.apache.org/docs/2.0.0/reference/org/apache/xmlbeans/   -  person flup    schedule 22.01.2014
comment
Зачем настаивать на XMLBeans? Почему бы просто не тривиально манипулировать строками? Проанализируйте результат: вам нужен результат Document.   -  person Bohemian♦    schedule 24.01.2014


Ответы (2)


К сожалению, с "обычным" файлом это невозможно. Прежде всего, файл, содержащий <Bar/>, должен быть XML-файлом, чтобы входящий XML-элемент мог привязываться к типу XMLBeans, а ваш файл — нет. Подробнее об этом можно прочитать в этом справочнике: XMLBeans

Если есть возможность преобразовать ваш "обычный" файл Bar в XML-файл и иметь Foo в качестве корневого элемента в foo.xml и Bar в качестве корня в bar.xml, то существует возможное обходное решение, такое как это:

1) создайте 2 файла XML foo.xml - элемент Foo является корневым

<?xml version="1.0" encoding="utf-8"?>
<Foo>
    <Bar/>
</Foo>

и bar.xml - элемент bar является корневым

<?xml version="1.0" encoding="utf-8"?>
<Bar/>

2) Создать 2 интерфейса "Документ"

FooDocument fooDocument = FooDocument.Factory.parse("foo.xml");
BarDocument barDocument = BarDocument.Factory.parse("bar.xml");

3) Создать экземпляр Бара

Bar barToCreate = fooDocument.getFoo().addNewBar();

4) сделать что-то с barToExploit (представить корневой элемент Bar из bar.xml)

Bar barToExploit = barDocument.getBar();

Тогда вам решать, что вы хотите делать с этим экземпляром barToExploit. Предположим, у него есть дочерний элемент, в котором хранится строка, которую вы можете сделать, например, так:

barToCreate.setValue(barToExploit.getValue());
person i-bob    schedule 21.01.2014

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

    if(fileStringArray.contains("<foo> ++ seperator + </foo>"){//inject text}

чтобы проверить контейнер содержимого, в который вы можете его поместить, а затем внедрить его туда. затем вы можете сохранить файл как файл xml следующим образом:

     while(fooDoc != null){
    fooDoc.write(YourString);
    fooDoc.write(Runtime().getRuntime().getProporty("line.seperator");
    }

или что-то типа того.

надеюсь, это сработает! удачи.

person user3200756    schedule 18.01.2014
comment
Использует ли это решение XML Beans? Вопрос конкретно об Apache XML Beans. - person Greg Mattes; 21.01.2014
comment
нет, это просто решение. Он не использует Apache XML Beans, но будет вставлять строку в файл. (лично я думаю, что это сработает) - person user3200756; 22.01.2014