[JAVA] แก้ไข XML ในส่วนของ CDATA กันครับ

ช่วงนี้ก็กลับมาทำ Thesis แล้วครับ หลังจากที่ได้ทำงานอย่างหนัก เพื่อลูกค้าไปจนดึกดื่นครับ โดยในปัญหาที่ผมเจอ คือ ต้องการ Update ค่าใน XML ครับ โดยมีตัวอย่างของ XML ที่ต้องการแก้ไขค่า ดังนี้ครับ

ก่อนแก้ไข

<bpmn:sequenceFlow id="SequenceFlow_1527j5i" name="else" sourceRef="ExclusiveGateway_0xrpnpu" targetRef="Reject_Loan_Request">
   <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${!(collateralAmt / loanAmt*100 > 70)}]]></bpmn:conditionExpression>
</bpmn:sequenceFlow>

หลังแก้ไข

<bpmn:sequenceFlow id="SequenceFlow_1527j5i" name="else" sourceRef="ExclusiveGateway_0xrpnpu" targetRef="Reject_Loan_Request">
   <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression"><![CDATA[${!(collateralAmt + loanAmt*100 > 70)}]]></bpmn:conditionExpression>
</bpmn:sequenceFlow>

จากรูปเห็นว่าค่าใน XML Node ที่ผมต้องการแก้ไขมันมีอักขระพิเศษอย่าง

<![CDATA[ --ข้อมูลที่ต้องการแสดงผล-- >

สำหรับเจ้า CDATA มันมีชื่อเต็ม คือ Character Data ครับ จุดประสงค์ของมันก็ตรงตัวเลยครับ ยัดอะไรเข้ามาใช้ XML ก็ต้องเก็บตามที่ยัดครับ ไม่เว้นพวกอักขระพิเศษ ตามตารางด้านล่างเลยครับ

สิ่งที่ XML เก็บสัญลักษณ์ที่แสดง
&lt ;<
&gt ;>
&le ;<=
&ge ;>=

มาดูดีกว่า Java มีการจัดการสำหรับการแก้ไขค่า CDATA บน Node ที่สนใจ ถ้าภาษา XML พื้นที่ตรงนี้จะเรียกว่า Text Node ครับ เอ้ามาดู Code กันเลยครับ

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new File(pMutantTestItem.getBPMNSoureFilePath()));
doc.setXmlStandalone(true);         //เอาไว้แก้ปัญหาตอนเขียนไฟล์ที่ java ชอบใส่  Standalone
doc.getDocumentElement().normalize();

//ค้นหา BPMN
NodeList nList = doc.getElementsByTagName("bpmn:conditionExpression");
            
for (int i = 0; i < nList.getLength(); i++) {
   Node n = nList.item(i);
   if (n.getNodeType() == Node.ELEMENT_NODE) {
      Element elem = (Element) n;
      //สร้าง CDATA ขึ้นมาครับ                           
      CDATASection mutantCData = doc.createCDATASection(mutant.getMutantStatement());
      //elem.getFirstChild() => ถ้ามี Tag ข้างใน มันจะเอาค่าของ Tag มาแทนครับ Text Node
      elem.replaceChild(mutantCData, elem.getFirstChild());
   }
}

Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.