2017-03-15 19 views
1
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<extendedinfo type="html"> 
    <![CDATA[<table class="ResultTable" cellpadding=2 cellspacing=1 border=0><tr class="TableHeadingLine"><th bgcolor="#b3b3b3" align="left" colspan="6"><font face="arial, verdana, trebuchet, officina, sans-serif" size="+2"><B>Testcase: Init Testreport</B></font></th></tr><tr class="TableHeadingLine"><th class="TableHeadingCell" width="120px"></th><th class="TableHeadingCell" width="120px"></th><th class="TableHeadingCell" width="80px"></th><th class="TableHeadingCell" width="345px"></th><th class="TableHeadingCell" width="345px"></th><th class="TableHeadingCell" width="70px"></th></tr>]]> 
</extendedinfo> 
<extendedinfo type="html"> 
    <![CDATA[<tr><td class="DefineCell">58.675124</td><td class="DefaultCell" colspan="5"><i><font color="#008000">Set_Temperature is set to 23</font></i><br>Set_Temperature = 23</td></tr>]]> 
</extendedinfo> 

CDATAセクション内にhtmlデータを含む上記の形式のツールで生成された.XMLファイルがあります。どのパーサーか、あるいはどのようにしてJavaを使ってXMLファイルからhtmlデータを取り出すことができますか?CDATAセクション内のHTMLタグでXMLファイルを解析するにはどうすればよいですか?

+0

テイクhttps://softwarecave.org/2014/02/18/parse-xml-document-using-streaming-api-for-xml-stax/次回はすべてのXMLを提供するように見える構造体を作成すると、コードを記述することができます。 –

+0

@SauliusNextファイルは1k行分のテーブルデータの多くと似ているので、これで十分かもしれないと思う。 –

答えて

1

ただ、テキストコンテンツ

バリアント1(DOM)としてCDATAにアクセス:

import java.io.BufferedInputStream; 
    import java.io.FileInputStream; 
    import java.io.InputStream; 
    import javax.xml.parsers.DocumentBuilder; 
    import javax.xml.parsers.DocumentBuilderFactory; 
    import org.w3c.dom.Document; 
    import org.w3c.dom.Node; 
    import org.w3c.dom.NodeList; 

public void getCDATAFromHardcodedPathWithDom() { 
    String yourSampleFile = "/path/toYour/sample/file.xml"; 
    String cdataNode = "extendedinfo"; 
    try (InputStream in = 
      new BufferedInputStream(new FileInputStream(yourSampleFile))) { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(in); 
     NodeList elements = doc.getElementsByTagName(cdataNode); 
     for (int i = 0; i < elements.getLength(); i++) { 
      Node e = elements.item(i); 
      System.out.println(e.getTextContent()); 
     } 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

バリアント2(STAX):

import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.InputStream; 

import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamConstants; 
import javax.xml.stream.XMLStreamReader; 

public void getCDATAFromHardcodedPathWithStax() { 
    String yourSampleFile = "/path/toYour/sample/file.xml"; 
    String cdataNode = "extendedinfo"; 
    XMLStreamReader r = null; 
    try (InputStream in = 
      new BufferedInputStream(new FileInputStream(yourSampleFile));)  { 
     XMLInputFactory factory = XMLInputFactory.newInstance(); 
     r = factory.createXMLStreamReader(in); 
     while (r.hasNext()) { 
      switch (r.getEventType()) { 
      case XMLStreamConstants.START_ELEMENT: 
       if (cdataNode.equals(r.getName().getLocalPart())) { 
        System.out.println(r.getElementText()); 
       } 
       break; 
      default: 
       break; 
      } 
      r.next(); 
     } 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } finally { 
     if (r != null) { 
      try { 
       r.close(); 
      } catch (Exception e) { 
       throw new RuntimeException(e); 
      } 
     } 
    } 
} 

付/パス/ toyourの/サンプル/ファイル.xml

<?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
<root> 
<extendedinfo type="html"> 
    <![CDATA[<table class="ResultTable" cellpadding=2 cellspacing=1 border=0><tr class="TableHeadingLine"><th bgcolor="#b3b3b3" align="left" colspan="6"><font face="arial, verdana, trebuchet, officina, sans-serif" size="+2"><B>Testcase: Init Testreport</B></font></th></tr><tr class="TableHeadingLine"><th class="TableHeadingCell" width="120px"></th><th class="TableHeadingCell" width="120px"></th><th class="TableHeadingCell" width="80px"></th><th class="TableHeadingCell" width="345px"></th><th class="TableHeadingCell" width="345px"></th><th class="TableHeadingCell" width="70px"></th></tr>]]> 
</extendedinfo> 
<extendedinfo type="html"> 
    <![CDATA[<tr><td class="DefineCell">58.675124</td><td class="DefaultCell" colspan="5"><i><font color="#008000">Set_Temperature is set to 23</font></i><br>Set_Temperature = 23</td></tr>]]> 
</extendedinfo> 
</root> 

Itあなた

<table class="ResultTable" cellpadding=2 cellspacing=1 border=0><tr class="TableHeadingLine"><th bgcolor="#b3b3b3" align="left" colspan="6"><font face="arial, verdana, trebuchet, officina, sans-serif" size="+2"><B>Testcase: Init Testreport</B></font></th></tr><tr class="TableHeadingLine"><th class="TableHeadingCell" width="120px"></th><th class="TableHeadingCell" width="120px"></th><th class="TableHeadingCell" width="80px"></th><th class="TableHeadingCell" width="345px"></th><th class="TableHeadingCell" width="345px"></th><th class="TableHeadingCell" width="70px"></th></tr> 


<tr><td class="DefineCell">58.675124</td><td class="DefaultCell" colspan="5"><i><font color="#008000">Set_Temperature is set to 23</font></i><br>Set_Temperature = 23</td></tr> 

にJAXBを使用して、興味深い選択肢を与えるだろう、ここで与えられる:抽出する方法について

Retrieve value from CDATA

例だけで、すべてのCDATAがここに与えられます。

Unable to check CDATA in XML using XMLEventReader in Stax

+0

大きなファイルの読み込みに適しています。 –

+0

私は2番目の変種を追加しましたstaxで、質問は1k行のxmlの小さなファイルに関するものでしたが。私の最初の答えの1つは、受け入れられた答えにコードを追加するのはいいですか? – jschnasse

+0

@jschnasseありがとう!助けを感謝する –

関連する問題