【问题标题】:Extract value of xml tags containing a particular string提取包含特定字符串的 xml 标记的值
【发布时间】:2015-01-22 07:36:49
【问题描述】:

我在标签“PROTOCOLTAG”中有一个包含所有不同类型协议的 xml 文件。我只想提取那些包含字符串“SITELINK”的标签的值。目前我能够获得所有标签“PROTOCOLTAG”的值。请帮忙

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

【问题讨论】:

  • 当前输出:没有,因为你的代码没有打印任何东西?
  • 我已经进行了更改。忘记了 println 语句..
  • 那么您已经完成了 XML 解析部分,您只需要知道如何检查字符串中是否包含特定的子字符串?

标签: java xml xml-parsing string-parsing stax


【解决方案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);
                }
           }
      }
 }

【讨论】:

  • txt.contains("SITELINK")。此外,您的代码不会打印以 SITELINK 开头的行。
  • 是的,indexOfcontains 都可以使用。
  • 非常感谢您的帮助!!
【解决方案2】:

这是用于 contains() 方法的;

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();
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2016-08-31
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-06-15
    • 2017-08-02
    相关资源
    最近更新 更多