- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 BIRT 和 XML 还很陌生,但正在尝试解决性能问题。现在我们有一个报告使用一个大的 XML 文件作为数据源,并且加载时间很长。所以我一直在探索不同的选择。我发现您可以使用脚本数据源并使用 java 来解析 XML。
我的问题是,即使 XML 文件中有信息,它也会将某些行留空。
我有一个测试 XML 文件,如下所示:
<?xml version="1.0"?>
<library>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author name="Giada De Laurentiis" country="it"/>
<year>2005</year>
<info>asdfghjkl</info>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author name="J K. Rowling" country="uk" />
<year>2005</year>
<info>asdfghjkl</info>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author name="James McGovern" country="us" />
<author name="Per Bothner" country="us" />
<info>asdfghjkl</info>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author name="Erik T. Ray" country="us" />
<year>2003</year>
<info>asdfghjkl</info>
</book>
</library>
在我打开的数据集中,我有
importPackage(javax.xml.parsers);
importPackage(javax.xml.xpath);
importPackage(org.w3c.dom);
importPackage(org.xml.sax);
var factory = DocumentBuilderFactory.newInstance();
var builder = null;
doc = null;
var expr = null;
factory.setNamespaceAware(true);
builder = factory.newDocumentBuilder();
doc = builder.parse(params["FileName"].value);
doc.getDocumentElement().normalize();
// create an XPathFactory
var xFactory = XPathFactory.newInstance();
// create an XPath object
xpath = xFactory.newXPath();
// compile the XPath expression
expr = xpath.compile("/library/*");
// run the query and get a nodeset
var result = expr.evaluate(doc, XPathConstants.NODESET);
//initialize object variables to be used in the fetch method
nodes = result;
x = 0;
y = 0;
cnt = nodes.getLength();
在获取下我有
var lboolAllowed = false;
if (x < cnt)
{
var nodeList = nodes.item(x).getChildNodes();
var nodeListLength = nodes.item(x).getChildNodes().getLength();
for(var i=0; i<nodeListLength; i++)
{
var nodeName = nodeList.item(i).getNodeName();
var nodeText = nodeList.item(i).getTextContent();
if(nodeName == "category")
{
row["category"] = nodeText;
}
if(nodeName == "year")
{
row["year"] = nodeText;
}
else if(nodeName == "info")
{
row["info"] = nodeText;
}
else if(nodeName == "title")
{
row["title"] = nodeText;
}
else if(nodeName == "author")
{
row["author"] = nodeText;
}
else if(nodeName == "country")
{
row["country"] = nodeText;
}
y++
}
x++;
y=0;
return (true);
}
return (false);
然后我有一个名为 FileName 的报告参数,它指向 XML 文件的位置。空白的行是类别、作者和国家/地区。我使用的是3.2.23版本。如果有帮助的话,这是报告中的 XML 源。
<?xml version="1.0" encoding="UTF-8"?>
<report xmlns="http://www.eclipse.org/birt/2005/design" version="3.2.23" id="1">
<property name="createdBy">Eclipse BIRT Designer Version 4.6.0.v201606072122</property>
<property name="units">in</property>
<property name="iconFile">/templates/blank_report.gif</property>
<property name="bidiLayoutOrientation">ltr</property>
<property name="imageDPI">120</property>
<parameters>
<scalar-parameter name="FileName" id="11">
<property name="hidden">true</property>
<property name="valueType">static</property>
<property name="dataType">string</property>
<property name="distinct">true</property>
<simple-property-list name="defaultValue">
<value type="constant">C:\Users\1122335\Desktop\Workspace\test\new207.xml</value>
</simple-property-list>
<list-property name="selectionList"/>
<property name="paramType">simple</property>
<property name="controlType">text-box</property>
<structure name="format">
<property name="category">Unformatted</property>
</structure>
</scalar-parameter>
</parameters>
<data-sources>
<script-data-source name="Data Source" id="9"/>
</data-sources>
<data-sets>
<script-data-set name="Data Set" id="12">
<list-property name="resultSetHints">
<structure>
<property name="position">1</property>
<property name="name">year</property>
<property name="dataType">integer</property>
</structure>
<structure>
<property name="position">2</property>
<property name="name">info</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">3</property>
<property name="name">category</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">4</property>
<property name="name">title</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">5</property>
<property name="name">author</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">6</property>
<property name="name">country</property>
<property name="dataType">string</property>
</structure>
</list-property>
<list-property name="columnHints">
<structure>
<property name="columnName">year</property>
<text-property name="displayName">year</text-property>
</structure>
<structure>
<property name="columnName">info</property>
<text-property name="displayName">info</text-property>
</structure>
<structure>
<property name="columnName">category</property>
<text-property name="displayName">category</text-property>
</structure>
<structure>
<property name="columnName">title</property>
<text-property name="displayName">title</text-property>
</structure>
<structure>
<property name="columnName">author</property>
<text-property name="displayName">author</text-property>
</structure>
<structure>
<property name="columnName">country</property>
<text-property name="displayName">country</text-property>
</structure>
</list-property>
<structure name="cachedMetaData">
<list-property name="resultSet">
<structure>
<property name="position">1</property>
<property name="name">year</property>
<property name="dataType">integer</property>
</structure>
<structure>
<property name="position">2</property>
<property name="name">info</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">3</property>
<property name="name">category</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">4</property>
<property name="name">title</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">5</property>
<property name="name">author</property>
<property name="dataType">string</property>
</structure>
<structure>
<property name="position">6</property>
<property name="name">country</property>
<property name="dataType">string</property>
</structure>
</list-property>
</structure>
<property name="dataSource">Data Source</property>
<method name="open"><![CDATA[importPackage(javax.xml.parsers);
importPackage(javax.xml.xpath);
importPackage(org.w3c.dom);
importPackage(org.xml.sax);
var factory = DocumentBuilderFactory.newInstance();
var builder = null;
doc = null;
var expr = null;
factory.setNamespaceAware(true);
builder = factory.newDocumentBuilder();
//doc = builder.parse("C:\Users\1122335\Desktop\Workspace\test\new207.xml");
doc = builder.parse(params["FileName"].value);
doc.getDocumentElement().normalize();
// create an XPathFactory
var xFactory = XPathFactory.newInstance();
// create an XPath object
xpath = xFactory.newXPath();
// compile the XPath expression
expr = xpath.compile("/library/*");
// run the query and get a nodeset
var result = expr.evaluate(doc, XPathConstants.NODESET);
//initialize object variables to be used in the fetch method
nodes = result;
x = 0;
y = 0;
cnt = nodes.getLength();
]]></method>
<method name="fetch"><![CDATA[var lboolAllowed = false;
if (x < cnt)
{
var nodeList = nodes.item(x).getChildNodes();
var nodeListLength = nodes.item(x).getChildNodes().getLength();
for(var i=0; i<nodeListLength; i++)
{
var nodeName = nodeList.item(i).getNodeName();
var nodeText = nodeList.item(i).getTextContent();
if(nodeName == "@category")
{
row["category"] = nodeText;
}
if(nodeName == "year")
{
row["year"] = nodeText;
}
else if(nodeName == "info")
{
row["info"] = nodeText;
}
else if(nodeName == "//title")
{
row["title"] = nodeText;
}
else if(nodeName == "//author")
{
row["author"] = nodeText;
}
else if(nodeName == "//country")
{
row["country"] = nodeText;
}
y++
}
x++;
y=0;
return (true);
}
return (false);]]></method>
<method name="close"><![CDATA[factory = null;
builder = null;
doc = null;
expr = null;
builder = null;
xFactory = null;
// create an XPath object
xpath = null;
result = null;
//initialize object variables to be used in the fetch method
nodes = null;
x = 0;
y = 0;
cnt = null;]]></method>
</script-data-set>
</data-sets>
<page-setup>
<simple-master-page name="Simple MasterPage" id="2">
<page-footer>
<text id="3">
<property name="contentType">html</property>
<text-property name="content"><![CDATA[<value-of>new Date()</value-of>]]></text-property>
</text>
</page-footer>
</simple-master-page>
</page-setup>
<body>
<table id="356">
<property name="dataSet">Data Set</property>
<list-property name="boundDataColumns">
<structure>
<property name="name">year</property>
<text-property name="displayName">year</text-property>
<expression name="expression" type="javascript">dataSetRow["year"]</expression>
<property name="dataType">integer</property>
</structure>
<structure>
<property name="name">info</property>
<text-property name="displayName">info</text-property>
<expression name="expression" type="javascript">dataSetRow["info"]</expression>
<property name="dataType">string</property>
</structure>
<structure>
<property name="name">category</property>
<text-property name="displayName">category</text-property>
<expression name="expression" type="javascript">dataSetRow["category"]</expression>
<property name="dataType">string</property>
</structure>
<structure>
<property name="name">title</property>
<text-property name="displayName">title</text-property>
<expression name="expression" type="javascript">dataSetRow["title"]</expression>
<property name="dataType">string</property>
</structure>
<structure>
<property name="name">author</property>
<text-property name="displayName">author</text-property>
<expression name="expression" type="javascript">dataSetRow["author"]</expression>
<property name="dataType">string</property>
</structure>
<structure>
<property name="name">country</property>
<text-property name="displayName">country</text-property>
<expression name="expression" type="javascript">dataSetRow["country"]</expression>
<property name="dataType">string</property>
</structure>
</list-property>
<column id="390"/>
<column id="391"/>
<column id="392"/>
<column id="393"/>
<column id="394"/>
<column id="395"/>
<header>
<row id="357">
<cell id="358">
<label id="359">
<text-property name="text">year</text-property>
</label>
</cell>
<cell id="360">
<label id="361">
<text-property name="text">info</text-property>
</label>
</cell>
<cell id="362">
<label id="363">
<text-property name="text">category</text-property>
</label>
</cell>
<cell id="364">
<label id="365">
<text-property name="text">title</text-property>
</label>
</cell>
<cell id="366">
<label id="367">
<text-property name="text">author</text-property>
</label>
</cell>
<cell id="368">
<label id="369">
<text-property name="text">country</text-property>
</label>
</cell>
</row>
</header>
<detail>
<row id="370">
<cell id="371">
<data id="372">
<property name="resultSetColumn">year</property>
</data>
</cell>
<cell id="373">
<data id="374">
<property name="resultSetColumn">info</property>
</data>
</cell>
<cell id="375">
<data id="376">
<property name="resultSetColumn">category</property>
</data>
</cell>
<cell id="377">
<data id="378">
<property name="resultSetColumn">title</property>
</data>
</cell>
<cell id="379">
<data id="380">
<property name="resultSetColumn">author</property>
</data>
</cell>
<cell id="381">
<data id="382">
<property name="resultSetColumn">country</property>
</data>
</cell>
</row>
</detail>
<footer>
<row id="383">
<cell id="384"/>
<cell id="385"/>
<cell id="386"/>
<cell id="387"/>
<cell id="388"/>
<cell id="389"/>
</row>
</footer>
</table>
</body>
</report>
最佳答案
这是一个与 XML/DOM 相关的问题:nodeName
没有 @
或 //
作为前缀(这是 XPath 的东西),但是只是元素或属性名称,所以不是 @category
而只是 category
,将它们删除
if(nodeName == "@category")
和
else if(nodeName == "//author")
{
row["author"] = nodeText;
}
else if(nodeName == "//country")
{
row["country"] = nodeText;
}
DOM Node中的表格javadoc 显示 Node.getNodeName()
另外你查询category/author/country的节点有误,参见:
var book = nodes.item(x);
var nodeList = book.getChildNodes();
var nodeListLength = nodeList.getLength();
row["category"] = book.getAttribute("category");
for(int i=0; i<nodeListLength; i++)
{
var child = nodeList.item(i);
var nodeName = child.getNodeName();
var nodeText = child.getTextContent();
if(nodeName == "year")
{
row["year"] = nodeText);
}
else if(nodeName == "info")
{
row["info"] = nodeText);
}
else if(nodeName == "title")
{
row["title"] = nodeText);
}
else if(nodeName == "author")
{
row["author"] = child.getAttribute("name");
row["country"] = child.getAttribute("country");
}
注意:作者实际上是一个列表
关于java - 使用 BIRT 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59143564/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!