在java中使用SAX解析器解析XML并从具有相同名称的多个标记中获取所需数据 /内容/包装[@name='GO Sales and Retailers'] /模型[@name='model'] [gosales_goretailers].[订单].[收入] 【gosales_goretailers】【国家】【销售区域】 [gosales_goretailers].[Orders].[Order method] 【gosales_goretailers】【订单】【订单年】 [gosales_goretailers].[产品].[产品线]

在java中使用SAX解析器解析XML并从具有相同名称的多个标记中获取所需数据 /内容/包装[@name='GO Sales and Retailers'] /模型[@name='model'] [gosales_goretailers].[订单].[收入] 【gosales_goretailers】【国家】【销售区域】 [gosales_goretailers].[Orders].[Order method] 【gosales_goretailers】【订单】【订单年】 [gosales_goretailers].[产品].[产品线],java,xml,Java,Xml,我想使用SAX解析器将文本值与其对应的数据项值存储在表达式标记中 表示我希望输出如下所示: (1) 收入=[gosales_goretailers].[Orders].[Revenue] (2) 销售地区=[gosales_goretailers]。[Countries]。[Sales territory] 我使用以下代码将所有文本值存储在Expression标记内的列表中 <report xmlns="http://developer.cognos.com/schemas/report/

我想使用SAX解析器将文本值与其对应的数据项值存储在表达式标记中

表示我希望输出如下所示: (1) 收入=[gosales_goretailers].[Orders].[Revenue] (2) 销售地区=[gosales_goretailers]。[Countries]。[Sales territory]

我使用以下代码将所有文本值存储在Expression标记内的列表中

<report xmlns="http://developer.cognos.com/schemas/report/7.0/"
expressionLocale="en-us">
<modelPath>/content/package[@name=’GO Sales and Retailers’]
/model[@name=’model’]</modelPath>
<queries>
<query name="Query1">
<source>
<model/>
</source>
<selection>
<dataItem name="Revenue" aggregate="total">
<expression>[gosales_goretailers].[Orders].[Revenue]</expression>
</dataItem>
<dataItem name="Sales territory" aggregate="none">
<expression>[gosales_goretailers].[Countries].[Sales territory]
</expression>
</dataItem>
<dataItem name="Order method" aggregate="none">
<expression>[gosales_goretailers].[Orders].[Order method]</expression>
</dataItem>
<dataItem name="Order year" aggregate="none">
<expression>[gosales_goretailers].[Orders].[Order year]</expression>
</dataItem>
<dataItem name="Product line" aggregate="none">
<expression>[gosales_goretailers].[Products].[Product line]</expression>
</dataItem>
final ArrayList dataItemList=new ArrayList();
最终ArrayList表达式列表=新ArrayList();
最终ArrayList retList=新ArrayList();
尝试
{
SAXParserFactory=SAXParserFactory.newInstance();
SAXParser SAXParser=factory.newSAXParser();
DefaultHandler=新的DefaultHandler(){
字符串retData=“”;
布尔值bDataItem=false;
布尔表达式=false;
public void startElement(字符串uri、字符串localName、字符串qName、,
属性)引发SAX异常{
if(qName.equalsIgnoreCase(“数据项”)){
bDataItem=true;
字符串名称=attributes.getValue(“名称”);
如果(!dataItemList.contains(名称))
{
dataItemList.add(名称);
retData=名称;
}
}
if(qName.equalsIgnoreCase(“表达式”)){
beexpression=true;
}
}
公共无效字符(char ch[],int start,int length)引发异常{
if(beexpression){
字符串exp=新字符串(ch、开始、长度);
如果(!expressionList.contains(exp))
{
expressionList.add(exp);
retData+=“@@sep@@@exp;
retList.add(retData);
retData=“”;
}
beexpression=false;
}
}
};
InputSource is=新的InputSource(新的StringReader(strXML));
parse(is,handler);
但它只打印第一个表达式标记中的文本值,而且不打印全文

产出即将到来:
Expression List={[gosales\u goretailers}

根据,解析器可能会调用characters()方法多次使用。

也许你的意思是like?另外,如果它没有打印全文,可能是因为characters方法无法处理元素文本在多个调用中传递的情况。如果希望列表包含不同的值,最好将其设置为
,实现为
哈希集
.也许它能解决这个问题problem@sharonbn主要问题是我没有获取expression标记中的全文。我想获取带有相应数据项的expression文本值value@NathanHughes你能给我一些关于如何配置characters方法的解决方案吗?看看这是否对你有帮助
       final ArrayList<String> dataItemList=new ArrayList<String>();
        final ArrayList<String> expressionList=new ArrayList<String>();
        final ArrayList<String> retList=new ArrayList<String>();

        try
        {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();


        DefaultHandler handler = new DefaultHandler() {

            String retData="";
            boolean bDataItem = false;
            boolean bExpression=false; 


            public void startElement(String uri, String localName,String qName, 
                        Attributes attributes) throws SAXException {



                if (qName.equalsIgnoreCase("dataitem")) {
                    bDataItem = true;

                    String name=attributes.getValue("name");

                    if(!dataItemList.contains(name))
                    {
                    dataItemList.add(name);
                    retData=name;
                    }

                }
                if (qName.equalsIgnoreCase("expression")) {
                    bExpression = true;

                }

            }


            public void characters(char ch[], int start, int length) throws SAXException {

                if (bExpression) {

                    String exp=new String(ch, start, length);
                    if(!expressionList.contains(exp))
                    {
                        expressionList.add(exp);
                        retData+="@@sep@@"+exp;
                        retList.add(retData);
                        retData="";
                    }
                    bExpression = false;
                }
            }

             };
             InputSource is=new InputSource(new StringReader(strXML));
             saxParser.parse(is, handler);