Aspose DataSet.readXml создает более сложную структуру

Menelaos Bakopoulos спросил: 12 мая 2018 в 04:34 в: java

Итак, я проверял примеры для Java и заметил пример, который использует InTableList.doc / InTableList из https://github.com/aspose-words/Aspose.Words- для-Java / tree / master / Examples / src.

Асорт Code

Они создают DataSet вручную в файле Common.java. Небольшая подсекция кода:

// Create a new data set
        DataSet ds = new DataSet("ds");        // Add a new table to store contracts
        DataTable dtContracts = new DataTable("Contracts");        // Add a new table to store managers
        DataTable dtManagers = new DataTable("Managers");        // Add a new table to store clients
        DataTable dtClients = new DataTable("Clients");        // Add columns to Managers table
        dtManagers.getColumns().add("Id", int.class);
        dtManagers.getColumns().add("Name");
        dtManagers.getColumns().add("Age", int.class);
        dtManagers.getColumns().add("Photo", byte[].class);
        ds.getTables().add(dtManagers);        // Add columns to Contracts table
        dtContracts.getColumns().add("Id", int.class);
        dtContracts.getColumns().add("ClientId", int.class);
        dtContracts.getColumns().add("ManagerId", int.class);
        dtContracts.getColumns().add("Price", float.class);
        dtContracts.getColumns().add("Date", Date.class);
        ds.getTables().add(dtContracts);        // Add columns to Clients table
        dtClients.getColumns().add("Id", int.class);
        dtClients.getColumns().add("Name");
        ds.getTables().add(dtClients);
        ds.getRelations().add(dtClients,dtContracts, "Id","ClientId");
        ds.getRelations().add(dtManagers,dtContracts, "Id","ManagerId");

И шаблон слова выглядит так:

<<foreach [m in ds.Managers]>><<[m.Name]>>  <<[m.Contracts.sum(
c => c.Price)]>><</foreach>>Total:  <<[ds.Contracts.
sum(
c => c.Price)]>>

Это кажется довольно простым и корневой узел не нужен.

Мой код

У меня есть следующая структура XML:

<root>
    <reference>b</reference>
    <caseHandler>
        <fullName>dddd</fullName>
        <active>true</active>
    </caseHandler>
    <name>This is the name of the case</name>
    <deadline>1528220937444</deadline>
    <associated>
        <code>ddd</code>
        <active>true</active>
        <id>-9</id>
        <parentScopeId>-3</parentScopeId>
        <title>ddddddddddd</title>
    </associated>
    <associated>
        <code>ddd</code>
        <active>true</active>
        <id>-9</id>
        <parentScopeId>-3</parentScopeId>
        <title>ddddddddddd</title>
    </associated>
</root>

И я загружаю XML в dataSet следующим образом:

DataSet set = new DataSet("ds");
set.readXml(new ByteArrayInputStream(escaped.getBytes()));log.info("XML " + otherXml);ReportingEngine engine = new ReportingEngine();
engine.buildReport(doc, set);//model

Проблема

Основной отчет настаивает на том, что все находится под узлом "ROOT". Очевидно, это тег <root> xml. Как я могу измените мой набор, чтобы избавиться от этого дополнительного уровня?

Моя проблема в том, что мне нужно окружить весь текст в текстовом файле "foreach", который связан с этим "root".

<<foreach [c in root]>> << [c.name] >> << [c.reference] >>Case Handler : 
<< [c.caseHandler.first().fullName] >><<foreach [in c.associated]>>
    (<<[code]>>)    <<[title]>>                     <</foreach>> <</foreach>>

Это очень раздражает ...

Я бы предпочел что-то более простое:

 << [ds.name] >> << [ds.reference] >>    Case Handler : 
    << [ds.caseHandler.first().fullName] >>    <<foreach [in ds.associated]>>
        (<<[code]>>)    <<[title]>>                     <</foreach>>

Вопрос

Как упростить структуру, чтобы я мог читать XML, но мне не нужны дополнительные накладные расходы в слове файл?


2 ответа

Есть решение
Tahir Manzoor ответил: 12 мая 2018 в 04:41

Пожалуйста, используйте ReportingEngine.buildReport, как показано ниже, чтобы получить желаемый результат.

Шаблон: < < [ds.name] > > < < [ds.reference] > >

DataSet set = new DataSet("ds");
set.readXml(MyDir + "in.xml");Document doc = new Document(MyDir + "template.docx");
ReportingEngine engine = new ReportingEngine();
engine.buildReport(doc, set.getTables().get("root").getRows().get(0), "ds");//modeldoc.save(MyDir + "output.docx");

Я работаю с Aspose как Developer Evangelist.

Menelaos Bakopoulos ответил: 13 мая 2018 в 06:51
Спасибо! Можно ли также удалить ds, чтобы мы напрямую обращались к переменным? Используем ли мы только: engine.buildReport(doc, set.getTables().get("root").getRows().get(0));
Tahir Manzoor ответил: 13 мая 2018 в 02:36

Да, вы можете удалить ds из полей "name" и "reference". В этом случае вам нужно использовать метод ReportingEngine.buildReport (Document, Object [], String []), как показано ниже.

Шаблон: < < [name] > > > & Л; & Lt; [ссылка] & GT; & GT;

DataSet set = new DataSet("ds");
set.readXml(MyDir + "in.xml");Document doc = new Document(MyDir + "template.docx");
ReportingEngine engine = new ReportingEngine();
engine.setOptions(ReportBuildOptions.ALLOW_MISSING_MEMBERS);
engine.buildReport(doc, new Object[]{set.getTables().get("root").getRows().get(0), set}, new String[] {"", "ds"});//model
doc.save(MyDir + "output.docx");