Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.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中的元素_Java_Xml_Dom - Fatal编程技术网

Java 按模式指定的顺序在序列下插入XML中的元素

Java 按模式指定的顺序在序列下插入XML中的元素,java,xml,dom,Java,Xml,Dom,我们有大量将数据解析为XML文件的程序工作流程。我们有大约14个方案,每个方案都有不同的根,由大约60个XSD文件组成。一些计划具有相似的要素,但目前正在每周对这些计划进行修改 我有一个stage(用Java编写),它接受一个XML文件(可能对应于14个方案中的任何一个),并读取(xpath,message)的元组列表,对于每个xpath,在包含消息的xpath定义的元素下插入一个flag元素 <default:flag issueDateTime="2012-01-10T21:00:09

我们有大量将数据解析为XML文件的程序工作流程。我们有大约14个方案,每个方案都有不同的根,由大约60个XSD文件组成。一些计划具有相似的要素,但目前正在每周对这些计划进行修改

我有一个stage(用Java编写),它接受一个XML文件(可能对应于14个方案中的任何一个),并读取(xpath,message)的元组列表,对于每个xpath,在包含消息的xpath定义的元素下插入一个flag元素

<default:flag issueDateTime="2012-01-10T21:00:09" recipient="lablabla" resolvedIndicator="false" sender="SS" xmlns:default="default">
  <default:flagSubject/>
  <default:message>
    <default:p>This element should be non empty</default:p>
  </default:message>
</default:flag>

我希望在不依赖MOXy的情况下使用标准DOM接口获得答案。

为什么不使用JAXB?当您将JAXB与XJC一起使用时,您可以

  • 从XSD文件生成Java类
  • 使用JAXB将XML解组为Java对象
  • 使用Java操作XML
  • 再次使用JAXB将Java对象解组为有效的XML

这是使用标准的JavaXMLAPI,但不是直接使用DOM。但是,JAXB包含在每个JDK中,因此您没有额外的依赖项

我们遇到了相同的问题(基本上,在各种XML中插入一组元素后,我们需要将其排序为正确的模式定义顺序,复杂的模式包括其他模式等)。长话短说,我最终编写了一个程序,该程序使用DOM解析器解析模式树,然后使用该信息对使用这些模式的其他XML中的序列元素进行排序。@UMad感谢您的评论,我很惊讶Java DOM API没有提供这一点。你会考虑分享你的代码吗?对不起。我不拥有自己编写代码的权利,付费的客户拥有。基本思想是XSD也是一种XML,这使得使用dom解析器处理它成为可能。可以解析所有包含和名称空间。@Meitham您是如何解决此问题的?我面临着非常相似的问题issue@LearnerJAXB方法被客户拒绝,并最终改变了他们的模式以避免问题。不幸的是,这意味着我们没有解决这个问题。我们不能使用JAXB,因为这意味着我们必须在每次方案更改时将它们编译成类。我研究了MOXy,它可以为我动态编译模式,所以我不需要每次模式更改时都创建一个新的jar,但不幸的是,我发现它很脆弱且不稳定。我觉得这可以用标准的DOM API来完成,但我不知道怎么做。你可以不用源代码生成就使用JAXB,但我没有这方面的经验。。。也许有人有更好的解决办法
Element flag = rawXmlDoc.createElementNS("default", "default:flag");
xpath = factory.newXPath();
xpath.setNamespaceContext(nsContext);
XPathExpression expr = xpath.compile(xpathText);
Element refNode = (Element)expr.evaluate(rawXmlDoc, XPathConstants.NODE);
if (refNode.getNodeType()==Node.ELEMENT_NODE)
    refNode.appendChild(flag);
else 
    refNode.getParentNode().appendChild(flag);