2016-04-20 12 views
3

でXML値を取得するには、Javaを使用して値を得たが、すべての値は私が読んで、私は、列のデータがBase64でのencryption.iをXML形式である必要がありjavaの

<?xml version="1.0" encoding="UTF-8"?> 
<event id="370e7324-3-85ec-63dac16aacb6"> 
<properties> 
<property enc="BASE64" name="state" value="Hrthyw35WmnmewqzRlYXI="/> 
<property enc="BASE64" name="record" value="mjhm65WmnmewqzRlYXI="/>  
<property enc="BASE64" name="application" value="Q2FsZWmnmewqzRlYXI="/> 
</properties> 
</event> 

のみ特定の値をしたい取得し、私のJavaコードがあります

try { 
Query q="select xml from empdata"; 
String xml = result.getString(1); 
System.out.println("----xml----"+xml); 
sqlService.dbRead(connection,sql.toString(),new SqlReader() 
{ 
    @Override  
    public Object readRecord(ResultSet result) 
     { 
      try {       
        String xml = result.getString(1); 

         // read the xml 
         InputSource is = new InputSource(); 
         is.setCharacterStream(new StringReader(xml)); 
         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
         Document doc = dBuilder.parse(is); 
         doc.getDocumentElement().normalize(); 
         NodeList nList = doc.getElementsByTagName("property"); 
         String name = null; 
         String value = null; 
         for (int temp = 0; temp < nList.getLength(); temp++) { 
          Node node = nList.item(temp); 
          Element element=null; 
          if (node.getNodeType() == Node.ELEMENT_NODE) { 
           element = (Element) node; 
           name= element.getAttribute("name"); 
           value = element.getAttribute("value"); 
           System.out.println("--value--"+value+"----name----"+name); 
          } 
         } 
       } catch (SQLException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      return null; 
     } 
}); 
}catch (SQLException e) { 
    e.printStackTrace(); 
} 

私は3つの名前と3つの値を取得していますが、私は3番目の名前と値しか必要としません。あなたは「アプリケーション」の名前を持つものをしたいと仮定すると、

+5

Base64では、条件(「アプリケーション」.equalsIgnoreCase(名))の場合のような場合 – Adam

+0

は、なぜあなたは、簡単な使用していない...それはエンコーディングだ、暗号化ではありません{//あなたがやりたいです}; –

+1

Java SE XPathを使用しないのはなぜですか? – dnsserver

答えて

1

..

また、コードを単純化することもできます。ノードのタイプをチェックする必要はなく、getElementsByTagNameはElementタイプのノードのみを返します。

独自のフィルタリングロジックを記述することの代替として例

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<event id=\"370e7324-3-85ec-63dac16aacb6\">\n" 
     + "<properties>\n" + "<property enc=\"BASE64\" name=\"state\" value=\"Hrthyw35WmnmewqzRlYXI=\"/>\n" 
     + "<property enc=\"BASE64\" name=\"record\" value=\"mjhm65WmnmewqzRlYXI=\"/>\n" 
     + "<property enc=\"BASE64\" name=\"application\" value=\"Q2FsZWmnmewqzRlYXI=\"/>\n" + "</properties>\n" 
     + "</event>\n"; 

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(new InputSource(new StringReader(xml))); 
doc.getDocumentElement().normalize(); 
NodeList properties = doc.getElementsByTagName("property"); 

for (int index = 0; index < properties.getLength(); index++) { 
    Node node = properties.item(index); 
    Element element = (Element) node; 
    if ("application".equals(element.getAttribute("name"))) { 
     String name = element.getAttribute("name"); 
     String valueEncoded = element.getAttribute("value"); 
     String decoded = new String(Base64.getDecoder().decode(valueEncoded)); 
     System.out.println("--value--" + decoded); 
    } 
} 

、あなたはXPath、ネイティブJavaをサポートしたXMLの選択言語でこれを表現することができます。

XPath xPath = XPathFactory.newInstance().newXPath(); 
Element element = (Element) xPath.compile("//property[@name=\"application\"]").evaluate(doc, XPathConstants.NODE); 
String value = element.getAttribute("value"); 
+0

:デコードされた文字列=新しいString(Base64.getDecoder()。decode(valueEncoded)); getDecoder()メソッドは、Base64タイプのために定義されていません – Sri

+0

これはどのjarも必要ですか? – Sri

+0

あまりにもアダムそれはうまく動作していただきありがとうございます – Sri

1

あなたが本当に第三プロパティ(ない「アプリケーション」)を必要とする場合は、ノードをカウントする必要があり..

var nodeIndex = -1; 
for (int temp = 0; temp < nList.getLength(); temp++) { 
    ... 
    if (node.getNodeType() == Node.ELEMENT_NODE) { 
     nodeIndex++; 
     ... 
     if (nodeIndex == 2){ 
      ... 
      System.out.println("--value--"+value+"----name----"+name); 
     } 
    } 
} 
0

なぜJAXBを使用しないのですか?エンタープライズアプリケーションのほとんどはJAXBを使用します。あなたは以下にいくつかのチュートリアルを得ることができます。あなたは、JAXBを使用していない

  1. http://www.mkyong.com/java/jaxb-hello-world-example/
  2. https://examples.javacodegeeks.com/core-java/xml/bind/jaxb-marshal-example/
  3. https://www.javacodegeeks.com/2014/12/jaxb-tutorial-xml-binding.html

としてはMavenのなど、コマンドラインを使用せずに、最も簡単な方法でそれを行うことができます

ステップ1:まず、 xsdファイルを作成する必要があります。 xsdを生成できるオンラインサイトはたくさんあります。今のところhttp://xmlgrid.net/xml2xsd.htmlを使用してください。 XSDは次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:element name="event"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="properties"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="property" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:attribute name="enc" type="xs:string"></xs:attribute> 
            <xs:attribute name="name" type="xs:string"></xs:attribute> 
            <xs:attribute name="value" type="xs:string"></xs:attribute> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute name="id" type="xs:string"></xs:attribute> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

編集:enc、name、およびvalueフィールドを任意にすることもできます。それらが存在しない場合、それはまたうまくいくでしょう。

ステップ2. eclipseで単純なJavaプロジェクトを作成し、JREがJREではないクラスパスまたはライブラリにJDKが存在することを確認します。それ以外の場合は、以下の例外が発生します。今

Error: Could not find or load main class com.sun.tools.internal.xjc.XJCFacade 

、日食の右Property.xsdをクリック - > [生成 - > JAXBクラス

注:それはdoesntの仕事をJDKへchangeing場合。クラスパスにJAXBに必要なJARがあることを確認してください。

ステップ3.名前が生成された新しいソースフォルダが作成されます。次に、xmlを読み取るクラスを作成します。

File Structure of Project

あなたPropertyLoadクラスは以下のようになります。

package generated; 

import java.io.File; 
import java.util.Iterator; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 

import generated.Event.Properties.Property; 

    public class LoadProperties { 

     public static void main(String[] args) { 

      try { 

       File file = new File("src/property.xml"); 
       JAXBContext jaxbContext = JAXBContext.newInstance(Event.class); 

       Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
       Event event = (Event) jaxbUnmarshaller.unmarshal(file); 

       Iterator<Property> itr = event.getProperties().getProperty().iterator(); 
       while (itr.hasNext()) { 
        Property prop = itr.next(); 
        System.out.println(
          "Encoding : " + prop.getEnc() + "Name : " + prop.getName() + " Value : " + prop.getValue()); 
       } 

      } catch (JAXBException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 
関連する問題