问题是这样的:<?xml version="1.0" encoding="UTF-8"?>
<ram>
<managedObject class="BTS" distName = "PLMN-PLMN/BSC-100/BTS-1" id="21851987">
<list name="celltpye">
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
</list>
<P name="name">chunshensijiyuan</P>
<p name="type">10</p>
<p name="trxpoint">1</p>
<P name="adfagq">fkbwrw</P>
<p name="colnumber">89</p>
<p name="stilllack">1</p>
</managedObject>
        <managedObject class="BSC" distName = "PLMN-PLMN/BSC-100" id="21851987">
<list name="celltpye">
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
</list>
<P name="name">Italy</P>
<p name="type">1</p>
<p name="trxpoint">1</p>
<P name="adfagq">fkbwrw</P>
<p name="colnumber">89</p>
<p name="stilllack">1</p>
</managedObject>
<managedObject class="BTS" distName = "PLMN-PLMN/BSC-100/BTS-2" id="21851988">
<list name="celltpye">
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
<P>0</P>
</list>
<P name="name">yinduxincun</P>
<p name="type">10</p>
<p name="trxpoint">1</p>
<P name="adfagq">joeiqonqa</P>
<p name="colnumber">158</p>
<p name="stilllack">1</p>
</managedObject></ram>
XML如上。这只是一部分因为文件太大只能用SAX
现在想得到 <managedObject class="BTS"> 中的指定元素。比如:
<managedObject class="BTS" distName = "PLMN-PLMN/BSC-100/BTS-2" id="21851988">这个节点下面的<P name="name">yinduxincun</P>
<p name="type">10</p>
<p name="trxpoint">1</p>
这三个元素
而且还要保留 <p>中的Attributes小弟不才,请各位前辈赐教了。谢谢

解决方案 »

  1.   

    不难,
    在startElement中判断BTS匹配则设flag
    在endElement中取消flag
    在startElement中判断flag若已设置则输出当前元素如此而已
      

  2.   

    代码如下,真的来写的话细节还挺啰嗦的public class GetBtsInnerPElements { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();
    XMLReader xr = sp.getXMLReader();
    xr.setContentHandler(new SaxHandler());
    URL file = GetBtsInnerPElements.class.getResource("management.xml");
    xr.parse(file.toString()); }}class SaxHandler implements ContentHandler {     private boolean enteredManagedObj = false;
        private boolean enteredP = false;
        private ArrayList attNames = new ArrayList();    public void setDocumentLocator(Locator locator) { 
        }     public void startDocument() throws SAXException { 
         attNames.add("name");
         attNames.add("type");
         attNames.add("trxpoint");
        }     public void endDocument() throws SAXException { 
        }     public void startPrefixMapping(String prefix, String uri) 
                throws SAXException { 
        }     public void endPrefixMapping(String prefix) throws SAXException { 
        }     public void startElement(String uri, String localName, String qName, 
                Attributes atts) throws SAXException { 
         if ("managedObject".equals(qName)) {
                int length = atts.getLength();
                for (int i=0; i<length; i++) {
                    String name = atts.getQName(i);
                    String value = atts.getValue(i);
                    if ("class".equals(name) && "BTS".equals(value)){
                     enteredManagedObj = true;
                     break;
                    }
                }
         }
         if (enteredManagedObj && "p".equalsIgnoreCase(qName)) {
                int length = atts.getLength();
                for (int i=0; i<length; i++) {
                    String name = atts.getQName(i);
                    if (attNames.contains(name)) {
                 enteredP = true;
                 break;
                    }
                }
                if (enteredP){
         System.out.print("<" + qName);
                for (int i=0; i<length; i++) {
                    String name = atts.getQName(i);
                    String value = atts.getValue(i);
                    System.out.print(" " + name + "=\"" + value + "\"");
                }
         System.out.print( ">");
                }
         }
        }     public void endElement(String uri, String localName, String qName) 
                throws SAXException { 
         if (enteredManagedObj && "managedObject".equals(qName)) 
         enteredManagedObj = false;
         if (enteredP && "p".equalsIgnoreCase(qName)) {
         enteredP = false;
         System.out.println("</" + qName + ">");
         }
        }     public void characters(char[] ch, int start, int length) 
                throws SAXException { 
         if (enteredP)
         for (int i=0; i<length; i++)
         System.out.print(ch[start+i]);
        }     public void ignorableWhitespace(char[] ch, int start, int length) 
                throws SAXException { 
        }     public void processingInstruction(String target, String data) 
                throws SAXException { 
        }     public void skippedEntity(String name) throws SAXException { 
        } } 注意我把XML文档取名为management.xml,放在类路径中了