2012-03-16 2 views
0

XML 파싱 세계에서 초보자입니다. 나는 아래 주어진 네임 스페이스와 XML 파일을 읽기위한 솔루션을 찾았습니다. 나는이 stackoverflow 링크 Default XML namespace, JDOM, and XPath을 읽고 Element를 읽는 것이 좋습니다. 그러나 요소를 수정할 수는 없습니다. 여기 내 문제 설명이 간다.Java, JDom, XPath를 사용하여 XML 파일 (네임 스페이스) 수정

내 xml 파일은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<ProofSpecification xmlns="http://www.zurich.ibm.com/security/idemix" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.zurich.ibm.com/security/idemix ProofSpecification.xsd"> 

    <Declaration> 
     <AttributeId name="id1" proofMode="unrevealed" type="string" /> 
     <AttributeId name="id2" proofMode="unrevealed" type="string" /> 
    </Declaration> 

    <Specification> 
     <Credentials> 
      <Credential issuerPublicKey="file:/Users/ipk.xml" 
      credStruct="file:/Users/CredStruct_ResUAC.xml" name="SpecResUAC"> 
       <Attribute name="FirstName">id1</Attribute> 
       <Attribute name="LastName">id2</Attribute> 
      </Credential> 
     </Credentials> 

     <Pseudonyms> 
      <Pseudonym name="pseudonym"></Pseudonym> 
      <DomainPseudonym>1331859289489</DomainPseudonym> 
     </Pseudonyms> 

      <Messages /> 
    </Specification> 
</ProofSpecification> 

내 Java 코드 스 니펫은 다음과 같습니다.

public class ModifyXMLFileJDom { 

    public static void main(String[] args) throws JDOMException, IOException { 

     try { 
     SAXBuilder builder = new SAXBuilder(); 
     File xmlFile = new File("/blabla/ProofSpecResUAC_old.xml"); 

     Document doc = (Document) builder.build(xmlFile); 

     XPath xpath = XPath.newInstance("x:ProofSpecification/x:Specification/x:Pseudonyms/x:DomainPseudonym"); 
     xpath.addNamespace("x", doc.getRootElement().getNamespaceURI()); 
     System.out.println("domainPseudonym: "+xpath.valueOf(doc)); 
     xpath.setVariable("555555", doc); 

     XMLOutputter xmlOutput = new XMLOutputter(); 

     xmlOutput.setFormat(Format.getPrettyFormat()); 
     xmlOutput.output(doc, new FileWriter("/blabla/proofSpecOut.xml")); 

     System.out.println("File updated!"); 
     } catch (IOException io) { 
     io.printStackTrace(); 
     } catch (JDOMException e) { 
     e.printStackTrace(); 
     } 
    } 
} 

이 코드 조각은 잘 작동하고 "DomainPseudonym"읽기 요소가 작동합니다.

But I want to modify this element from 
<DomainPseudonym>1331859289489</DomainPseudonym> to 
<DomainPseudonym>555555</DomainPseudonym> 

나는 기능 xpath.setVariable ("555555", 문서)를 사용하여 수정하지만, 작동하지 않는 및 오류를 포기하지 않을했습니다. 결과적으로 동일한 내용을 새 xml 파일 "proofSpecOut.xml"에 복사합니다.

답변

2

XPath는 xml을 수정하는 데 사용되지 않으며 일부만 찾을 수 있습니다. XPath.setVariable()은 xpath 표현식에서 변수를 설정하기위한 것입니다. XPath.selectSingleNode()을 사용하여 문서의 요소 중 하나를 검색 한 다음 Element.setText()을 사용하여 직접 수정하려고합니다.

+0

감사합니다. 많은 jthalborn !! 그것은 효과가있다! 나는 많은 다른 파서와 다른 예를 시험해 보는 이래로 이것을 고심하고 있었다! :디 – iankits