XML到Java解析器:如何解析CDATA标记中显示的属性

XML到Java解析器:如何解析CDATA标记中显示的属性,java,xml,xml-parsing,cdata,domparser,Java,Xml,Xml Parsing,Cdata,Domparser,我目前正在从HP Quality Center SQL数据库中提取一些数据,并且我需要配置其他数据的正确表示形式的一些数据以XML格式存储。我对XML有基本的了解,能够解析大多数属性,并将它们转换为运行时对象,其中包含进一步数据检索所需的字段。但是我无法提取a区域内的属性。由于有关要搜索哪些表以及应用哪些过滤器的重要信息,因此在运行时以编程方式处理其中的数据是必需的 我有一个单类可运行的示例,它只为我读入java对象的每个字段提供一个打印行输出,当我试图提取CDATA属性时,它就失败了 我读过很

我目前正在从HP Quality Center SQL数据库中提取一些数据,并且我需要配置其他数据的正确表示形式的一些数据以XML格式存储。我对XML有基本的了解,能够解析大多数属性,并将它们转换为运行时对象,其中包含进一步数据检索所需的字段。但是我无法提取a区域内的属性。由于有关要搜索哪些表以及应用哪些过滤器的重要信息,因此在运行时以编程方式处理其中的数据是必需的

我有一个单类可运行的示例,它只为我读入java对象的每个字段提供一个打印行输出,当我试图提取CDATA属性时,它就失败了

我读过很多关于什么是CDATA的文章,但没有一篇提到类似的设置,CDATA部分的内部显然包含属性

那么,是否有可能以与提取其他属性类似的方式提取这些属性?如果是,怎么做

提前谢谢

代码(xml字符串是来自数据库的硬编码示例):

import java.io.ByteArrayInputStream;
导入java.io.IOException;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入javax.xml.parsers.parserConfiguration异常;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
导入org.w3c.dom.NodeList;
导入org.xml.sax.SAXException;
公共类XMLParser{
公共静态void main(字符串[]args){
字符串xml=“”+
"" +
"" +
"" +
"" +
"" +
"";
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(“时间分辨率:+ad.getTimeResolution());
System.out.println(“版本:+ad.getVersion());
System.out.println(“过滤器:+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());
}
公共静态分析定义createFilterData(字符串xml){
AnalysisDefinition ad=新的AnalysisDefinition();
DocumentBuilderFactory docFactory=DocumentBuilderFactory.newInstance();
docFactory.setNamespaceAware(true);
docFactory.setValidating(假);
setIgnoringElementContentWhitespace(true);
单据单据=空;
试一试{
DocumentBuilder docBuilder=docFactory.newDocumentBuilder();
ByteArrayInputStream是=新的ByteArrayInputStream(xml.getBytes());
doc=docBuilder.parse(is);
}捕获(ParserConfiguration异常e){
e、 printStackTrace();
}捕获(SAXE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
NodeList nl=doc.getElementsByTagName(“分析定义”);
for(int i=0,stop=nl.getLength();i
CDATA表示“字符数据”,即没有标记的文本。因此,CDATA中没有属性;如果选择,则只能将文本解释为属性。通过将它们包装在CDATA中,您已经指示XML解析器不要以任何方式解释它们。如果您确实知道CDATA节中数据的语法,无论是XML还是其他类似JSON的内容,您必须将CDATA中的文本传递给适当的解析器以提取结构。

CDATA只是一种特殊的语法,以避免XML语法的歧义,因此CDATA中嵌入的字符串就是:一个普通的非XML字符串,所以这取决于你对它的分析。是的,这就是希望得到帮助的原因。。。例如,我如何将CDATA中的文本提取到它自己的单独字符串中进行解析?它能以类似于DOMParser的方式完成吗?有人有这方面的经验吗?我尝试过做一些子字符串尝试,但相当复杂的CDATA标记被解释为正则表达式,我似乎无法正确地转义。如果有人读过这篇文章,那么从QC SQL数据库提取数据的尝试是非常错误的。了解更多关于OTA api的信息,或者更好地了解REST api如何提取数据。
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;
    }
}