2015-01-22 5 views
0

У меня есть xml-файл, содержащий все разные типы протоколов в теге «PROTOCOLTAG». Я хочу извлечь значения только те теги, которые содержат строку «SITELINK». В настоящее время я могу получить значения всего тега «PROTOCOLTAG». Пожалуйста, помогитеИзвлечь значение тегов xml, содержащих определенную строку

XML-файл ..

<?xml version="1.0" encoding="UTF-8"?> 
<CDMDataXML xmlns="http://www.avocent.org/trellis/CDMLoaderXMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.avocent.org/trellis/CDMLoaderXMLSchema CDMLoaderXMLSchema.xsd"> 
    <NetworkProtocolDefinition oid="00000000-0000-0000-0000-000000004236"> 
    <NAME>res.dcim.networkprotocol.def.SNMPV1-SSL</NAME> 
    <PROTOCOLTAG>SNMPV1:SSL</PROTOCOLTAG> 
</NetworkProtocolDefinition> 
<NetworkProtocolDefinition oid="00000000-0000-0000-0000-000000004237"> 
    <NAME>res.dcim.networkprotocol.def.SNMPV2-SSL</NAME> 
    <PROTOCOLTAG>SNMPV2:SSL</PROTOCOLTAG> 
</NetworkProtocolDefinition> 
<NetworkProtocolDefinition oid="00000000-0000-0000-0000-000000004238"> 
    <NAME>res.dcim.networkprotocol.def.BACNET-SITELINK_W-LDM-BREAKER-RS-485</NAME> 
    <PROTOCOLTAG>BACNET:SITELINK_W-LDM-BREAKER/RS-485</PROTOCOLTAG> 
</NetworkProtocolDefinition> 
<NetworkProtocolDefinition oid="00000000-0000-0000-0000-000000004239"> 
    <NAME>res.dcim.networkprotocol.def.BACNET-SITELINK_W-LDM-SUBFEED-RS-485</NAME> 
    <PROTOCOLTAG>BACNET:SITELINK_W-LDM-SUBFEED/RS-485</PROTOCOLTAG> 
</NetworkProtocolDefinition> 

Java код ..

XMLInputFactory f = XMLInputFactory.newInstance(); 
XMLStreamReader rdr = f.createXMLStreamReader(new FileReader("test.xml")); 
while (rdr.hasNext()) { 
    if (rdr.next() == XMLStreamConstants.START_ELEMENT) { 
     if (rdr.getLocalName().equals("PROTOCOLTAG")) { 
      System.out.println(rdr.getElementText()); 
     } 
    } 
} 

Ожидаемый результат

BACNET:SITELINK_W-LDM-BREAKER/RS-485 
BACNET:SITELINK_W-LDM-SUBFEED/RS-485 

Выходной ток ..

SNMPV1:SSL 
SNMPV2:SSL 
BACNET:SITELINK_W-LDM-BREAKER/RS-485 
BACNET:SITELINK_W-LDM-SUBFEED/RS-485 
+0

Выходной ток: Ничего, потому что ваш код ничего не печатать? – immibis

+0

Я внес изменения. Забыл заявление println. – Lucy

+1

Итак, у вас уже есть часть синтаксического анализа XML, вам просто нужно знать, как проверить, содержит ли строка определенную подстроку внутри нее? – immibis

ответ

1
XMLInputFactory f = XMLInputFactory.newInstance(); 
XMLStreamReader rdr = f.createXMLStreamReader(new FileReader("C:\\Users\\pramod.karandikar\\Desktop\\Test.xml")); 
while (rdr.hasNext()) { 
     if (rdr.next() == XMLStreamConstants.START_ELEMENT) { 
      if (rdr.getLocalName().equals("PROTOCOLTAG")) { 
       String txt = rdr.getElementText(); 
       if (txt.indexOf("SITELINK") > 0) { 
        System.out.println(txt); 
       } 
      } 
     } 
} 
+0

Или 'txt.contains (" SITELINK ")'. Кроме того, ваш код не будет печатать строки, начинающиеся с SITELINK. – immibis

+0

Да, может использоваться любой из 'indexOf' и' contains'. –

+0

Большое спасибо за помощь! – Lucy

0

Это для содержит метод();

XMLInputFactory f = XMLInputFactory.newInstance(); 
XMLStreamReader rdr; 
try { 
    rdr = f.createXMLStreamReader(new FileReader("test.xml")); 
     while (rdr.hasNext()) { 
     if (rdr.next() == XMLStreamConstants.START_ELEMENT) { 
      if (rdr.getLocalName().equals("PROTOCOLTAG")) { 
       String str = rdr.getElementText().toString(); 
       if (str.toString().contains("SITELINK")) { 
       System.out.println(str); 
       } 
      } 
     } 
    } 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (XMLStreamException e) { 
    e.printStackTrace(); 
} 

}