Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当存在多个同名节点时修改XML中的值 201805231510 2018-05-23T12:01:14 1. 111 客户名称 orgNumber ABCD_Java_Xml - Fatal编程技术网

Java 当存在多个同名节点时修改XML中的值 201805231510 2018-05-23T12:01:14 1. 111 客户名称 orgNumber ABCD

Java 当存在多个同名节点时修改XML中的值 201805231510 2018-05-23T12:01:14 1. 111 客户名称 orgNumber ABCD,java,xml,Java,Xml,我发现了几个关于如何修改XML文件中某些文本的示例。但我的问题是存在重复的节点,如下面的示例中,节点Id多次出现。我想用其他东西修改值orgNumber,但我没有找到正确的Id。任何输入都将不胜感激。您的XML看起来像ISO 20022银行间/支付消息。我已经成功地将JAXB与ISO20022模式结合使用。JAXB(J2EE/JEE的一部分,或者现在称之为Jakarta EE)将为您提供XML消息的Java POJO表示,然后您可以像任何其他Java对象图一样自由构建和操作该消息。例如,您可以使

我发现了几个关于如何修改XML文件中某些文本的示例。但我的问题是存在重复的节点,如下面的示例中,节点Id多次出现。我想用其他东西修改值orgNumber,但我没有找到正确的Id。任何输入都将不胜感激。

您的XML看起来像ISO 20022银行间/支付消息。我已经成功地将JAXB与ISO20022模式结合使用。JAXB(J2EE/JEE的一部分,或者现在称之为Jakarta EE)将为您提供XML消息的Java POJO表示,然后您可以像任何其他Java对象图一样自由构建和操作该消息。例如,您可以使用Java表达式访问示例中(最里面的)
Id
元素的内容,如

<CstmrCdtTrfInitn>
    <GrpHdr>
        <MsgId>201805231510</MsgId>
        <CreDtTm>2018-05-23T12:01:14</CreDtTm>
        <NbOfTxs>1</NbOfTxs>
        <CtrlSum>111.00</CtrlSum>
        <InitgPty>
            <Nm>custName</Nm>
            <Id>
                <OrgId>
                    <Othr>
                        <Id>orgNumber</Id>
                        <SchmeNm>
                            <Cd>ABCD</Cd>
                        </SchmeNm>
                    </Othr>
                </OrgId>
            </Id>
        </InitgPty>
    </GrpHdr>
</CstmrCdtTrfInitn>

要使用JAXB,需要有描述XML数据的XML模式文件(
.xsd
文件)。您需要从
.xsd
文件中生成Java类,使用例如(来自maven)或仅使用作为JAXB参考实现一部分的
xjc
工具(来自命令行),然后为您拥有的模式配置JAXB。您通常希望至少配置生成的Java类的Java包名称空间。

到目前为止您尝试了什么?我们不想建议对您不起作用的内容。使用您最喜欢的DOM解析器解析整个XML树并在那里进行更改,然后序列化回文本。建议使用XPath和DOM API可能会以一般方式回答这个问题,但对于ISO 20022和其他大规模XML消息有效负载来说,这肯定是错误的方法;这里更推荐JAXB或其他类型化方法,因为ISO 20022消息模式是由UMLThank生成的,请大家评论我的文章。这个JAXB听起来像是我需要进一步了解的东西,但正如您所注意到的,我没有做过太多编程,所以我正在尝试一些至少可以找到一些示例的东西。我尝试了很多不同的方法,但或多或少都是以下面的方式,我无法到达workNodeList InitgPtyNodeList=doc.getElementsByTagName(“InitgPty”);对于(int i=0;ixjc-p pain113.JAXB.beans pain113.xsd”来实现。现在我有了许多Java文件,正如您所说,我可以编写类似myMessage.getGrpHdr().getInitgPty().getId().getOrgId().getOrgId().getId().getId()这样的文件;然而,现在当然出现了另一个问题。如何将这些类连接到实际的XML?我读了一些关于编组和解编组的内容,但我不完全理解。这就是我目前正在尝试的:File File=new File(“C:\\Test\\src\\T1.XML”);JAXBContext JAXBContext=JAXBContext.newInstance();Unmarshaller jaxbUnmarshaller=jaxbContext.createUnmarshaller();pain113.jaxb.beans.Document d=(pain113.jaxb.beans.Document)jaxbUnmarshaller.unmarshal(文件);System.out.println(d.getcstmrcdtrfinitn().getGrpHdr().getInitgPty().getNm());但这只会给我带来很多错误。有什么建议吗?@AmirSejdinovic我建议你发布另一个SO问题,并提供详细信息(描述你的设置和收到的错误消息)-很难说不知道你的类路径设置、你的IDE(如果有)等等。祝贺你走到了这一步!
CstmrCdtTrfInitn myMessage = ...;
String valueOfIdElement =
 myMessage.getGrpHdr().getInitgPty().getId().getOrgId().getId();