【发布时间】:2013-12-22 03:55:03
【问题描述】:
我目前正在从 HP Quality Center SQL 数据库中提取一些数据,而我需要配置其他数据的正确表示的一些数据以 XML 格式存储。我对 XML 有基本的了解,并且能够解析大部分属性,并将它们制作成包含进一步数据检索所需字段的运行时对象。但是我无法提取 - 区域内的属性。由于有关要搜索哪些表以及要应用哪些过滤器的重要信息,因此必须在运行时以编程方式处理其中的数据。
我有一个单类可运行示例,它只为我读入 java 对象的每个字段提供一个打印行输出,当我尝试提取 CDATA 属性时它会失败。
我已经阅读了很多关于 CDATA 是什么的文章,但似乎没有一篇提到类似的设置,其中 CDATA 部分的内部清楚地包含属性。
那么,是否可以以与提取其他属性类似的方式提取这些属性?如果有,怎么做?
提前致谢。
代码(xml 字符串是来自数据库的硬编码示例):
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XMLParser {
public static void main(String[] args){
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<AnalysisDefinition Version=\"2.0\" " +
"GraphProviderId=\"QC.Graph.Provider\" " +
"GroupByField=\"TC_STATUS\" " +
"ForceRefresh=\"False\" " +
"SelectedProjects=\"CURRENT-PROJECT-UID\" " +
"SumOfField=\"\" TimeResolution=\"Day\" " +
"DisplayOptions=\"Regular\">" +
"<Filter " +
"FilterState=\"Custom\" " +
"FilterFormat=\"Frec\">" +
"<![CDATA[[Filter]{" +
"TableName:TESTCYCL," +
"ColumnName:TC_ASSIGN_RCYC," +
"LogicalFilter:\\00000047\\^URLAnonymized^," +
"VisualFilter:\\00000047\\^URLAnonymized^," +
"NO_CASE:" +
"}" +
"]]>" +
"</Filter>" +
"<DateRange " +
"PeriodType=\"Custom\" " +
"StartDate=\"2013,9,29\" " +
"EndDate=\"2013,10,14\" " +
"/>" +
"</AnalysisDefinition>";
AnalysisDefinition ad = createFilterData(xml);
System.out.println("displayOtions: " + ad.getDisplayOptions());
System.out.println("graphProviderID: " + ad.getGraphProviderId());
System.out.println("GroupByField: " + ad.getGroupByField());
System.out.println("SumOfField: " + ad.getSumOfField());
System.out.println("TimeResolution: " + ad.getTimeResolution());
System.out.println("Version: " + ad.getVersion());
System.out.println("Filter: " + ad.getFilter());
System.out.println("DateRange: " + ad.getDateRange());
System.out.println("FilterState: " + ad.getFilter().getFilterState());
System.out.println("FilterFormat: " + ad.getFilter().getFilterFormat());
System.out.println("TableName: " + ad.getFilter().getTableName());
}
public static AnalysisDefinition createFilterData(String xml){
AnalysisDefinition ad = new AnalysisDefinition();
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
docFactory.setNamespaceAware(true);
docFactory.setValidating(false);
docFactory.setIgnoringElementContentWhitespace(true);
Document doc = null;
try {
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes());
doc = docBuilder.parse(is);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
NodeList nl = doc.getElementsByTagName("AnalysisDefinition");
for(int i = 0, stop = nl.getLength(); i < stop; i++){
Element e = (Element) nl.item(i);
ad.setVersion(e.getAttribute("Version"));
ad.setGraphProviderId(e.getAttribute("GraphProviderId"));
ad.setGroupByField(e.getAttribute("GroupByField"));
ad.setForceRefresh(Boolean.parseBoolean(e.getAttribute("ForceRefresh")));
ad.setSumOfField(e.getAttribute("SumOfField"));
ad.setTimeResolution(e.getAttribute("TimeResolution"));
ad.setDisplayOptions(e.getAttribute("DisplayOptions"));
}
nl = doc.getElementsByTagName("Filter");
for(int i = 0, stop = nl.getLength(); i < stop; i++){
Element e = (Element) nl.item(i);
Filter filter = new Filter();
filter.setFilterState(e.getAttribute("FilterState"));
filter.setFilterFormat(e.getAttribute("FilterFormat"));
filter.setTableName(e.getAttribute("TableName"));
ad.setFilter(filter);
}
return ad;
}
}
【问题讨论】:
-
CDATA 只是一种特殊的语法,以避免与 XML 语法产生歧义,因此嵌入在 CDATA 中的字符串就是这样:一个普通的非 XML 字符串,所以由你来解析它。
-
是的,这就是希望得到帮助的原因......例如,我如何才能仅将 CDATA 中的文本提取到它自己的单独字符串中进行解析?它可以以类似于 DOMParser 的方式完成吗?有没有人有这方面的经验?我曾尝试做一些子字符串尝试,但相当复杂的 CDATA 标记被解释为正则表达式,我似乎无法正确转义。
-
万一有人读过这篇文章,这是从 QC SQL 数据库中提取数据的非常错误的尝试。阅读有关 OTA-api 的更多信息,甚至更好的 REST-api,了解如何提取数据。
标签: java xml xml-parsing cdata domparser