使用getname函数stax xml混淆

时间:2016-04-10 16:50:23

标签: java xml stax

我有一个像这样的xml文件:

<comment type="PTM">
    <text evidence="19">Sumoylated following its interaction with PIAS1 and UBE2I.</text>
</comment>
<comment type="PTM">
    <text evidence="17">Ubiquitinated, leading to proteasomal degradation.</text>
</comment>
<comment type="disease">
    <text>A chromosomal aberration involving ZMYND11 is a cause of acute poorly differentiated myeloid leukemia. Translocation (10;17)(p15;q21) with MBTD1.</text>
</comment>
<comment type="disease" evidence="23">
    <disease id="DI-04257">
        <name>Mental retardation, autosomal dominant 30</name>
        <acronym>MRD30</acronym>
        <description>A disorder characterized by significantly below average general intellectual functioning associated with impairments in adaptive behavior and manifested during the developmental period. MRD30 patients manifest mild intellectual disability and subtle facial dysmorphisms, including hypertelorism, ptosis, and a wide mouth.</description>
        <dbReference type="MIM" id="616083"/>
    </disease>
    <text>The disease is caused by mutations affecting the gene represented in this entry.</text>
</comment>
<comment type="similarity">
    <text evidence="8">Contains 1 bromo domain.</text>
</comment>
<comment type="similarity">
    <text evidence="9">Contains 1 MYND-type zinc finger.</text>
</comment>

我使用stax来提取疾病信息。这是我的代码的一部分:

XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader eventReader = factory.createXMLEventReader( new FileReader(p)); 

            while(eventReader.hasNext()){
               XMLEvent event = eventReader.nextEvent();
               switch(event.getEventType()){
                  case XMLStreamConstants.START_ELEMENT:
                     StartElement startElement = event.asStartElement();
                     String qName = startElement.getName().getLocalPart();
                     if (qName.equalsIgnoreCase("comment")) {
                        System.out.println("Start Element : comment");
                        Iterator<Attribute> attributes = startElement.getAttributes();
                        Attribute a = attributes.next(); 
                         System.out.println("ATRIBUTES " + a.getName());
                        type = a.getValue();
                        System.out.println("Roll No : " + type);
                     }  else if(qName.equalsIgnoreCase("text") && type.equals("disease")){ text = true; } 

                     break;

                    case XMLStreamConstants.CHARACTERS:
                     Characters characters = event.asCharacters();
                     if(text){ res = res + " " + characters.getData(); 
                        //System.out.println("TEXT: " + res);
                        text = false;
                     }
                    break;

                  case  XMLStreamConstants.END_ELEMENT:
                     EndElement endElement = event.asEndElement();
                     if(endElement.getName().getLocalPart().equalsIgnoreCase("comment")){
                        //System.out.println("End Element : comment"); 
                        //System.out.println();
                     }
                     break; 

对于这种类型的行:

<comment type="disease">

我可以正确提取信息,但是当我试图找到评论类型&#34;疾病&#34;在这一行:

<comment type="disease" evidence="23">

它给我类型=证据而不是类型=疾病应该是。因此,它不会从这种线路中保存任何东西。

2 个答案:

答案 0 :(得分:1)

很抱歉没有直接答案,但有关如何有效使用StaX或XmlPull的评论:流式XML解析器设计为友好的递归下降解析(避免显式状态建模,你经常需要SAX解析器) - 在你的情况下,我期望以下方法(拒绝或忽略所有意外的内容):

Comment parseComment(XMLEventReader eventReader) {
   // call parseText and parseDisease for the corresponding element starts
}

Text parseText(XMLEventReader eventReader) {
}

Disease parseDisease(XmlEventReader eventReader) {
} 

也就是说,有一个权衡:如果你不需要流方面(性能),你可能更好的只需要解析为DOM,然后通过步行或窥视DOM来根据需要提取信息,完全避免使用低级XML API。

答案 1 :(得分:0)

通过使用Stax,我假设您正在处理大型文档或资源有限的平台......事实上,内存开销主要是与DOM相关的问题。另一方面,VTD-XML比DOM更有效,同时保留了DOM风格编码的所有好处......请阅读这篇最新研究论文获取更多信息

http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf

import com.ximpleware.*;
public class queryAttr {
    public static void main(String[] s) throws VTDException{
        VTDGen vg = new VTDGen();
        vg.selectLcDepth(5);// improve XPath performance for deep document
        if (!vg.parseFile("input.xml", false))
            return;
        VTDNav vn = vg.getNav();
        AutoPilot ap = new AutoPilot(vn);
        ap.selectXPath("/root/comment[@type='disease' and @evidence='23']");
        int i=0,j=0;
        while((i=ap.evalXPath())!=-1){
            if (vn.toElement(VTDNav.FIRST_CHILD)){
                System.out.println(" element name: "+ vn.toString(vn.getCurrentIndex()));
                j=vn.getText();
                if (i!=-1)
                    System.out.println(""+vn.toString(i));
                if (vn.toElement(VTDNav.NS)){
                    System.out.println(" element name: "+ vn.toString(vn.getCurrentIndex()));
                    j=vn.getText();
                    if (i!=-1)
                        System.out.println("text node==>"+vn.toString(i));
                }
                if (vn.toElement(VTDNav.NS)){
                    System.out.println(" element name: "+ vn.toString(vn.getCurrentIndex()));
                    j=vn.getText();
                    if (i!=-1)
                        System.out.println("text node==>"+vn.toString(i));
                }
                if (vn.toElement(VTDNav.NS)){
                    System.out.println(" element name: "+ vn.toString(vn.getCurrentIndex()));
                    j=vn.getText();
                    if (i!=-1)
                        System.out.println("text node==>"+vn.toString(i));
                }
                vn.toElement(VTDNav.PARENT);
            }

        }
    }
}