Изменение XML-файла (пространства имен) с использованием Java, JDom, XPath - PullRequest
0 голосов
/ 17 марта 2012

Я новичок в мире анализа XML.Я нашел решение для чтения файла XML с «пространствами имен», как указано ниже.Я ссылался на эту стековую ссылку Пространство имен XML по умолчанию, JDOM и XPath , и чтение Элемента работает.Но я не могу изменить элемент.Вот мои утверждения о проблемах.

Мой 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", doc), но не работал и не выдавал никаких ошибок.Конечный результат заключается в том, что он копирует то же содержимое в новый XML-файл «proofSpecOut.xml».

1 Ответ

2 голосов
/ 17 марта 2012

XPath не используется для изменения XML, только для поиска его частей.XPath.setVariable() только для установки переменных в вашем выражении xpath.Вы хотите использовать XPath.selectSingleNode() для извлечения одного из элементов вашего документа, а затем хотите изменить его напрямую, используя Element.setText().

...