Java 如何使用Joox创建新的xml文件

Java 如何使用Joox创建新的xml文件,java,joox,Java,Joox,我试图创建一个具有结构的新xml,同时通过它添加元素 String styleName = "myStyle"; String styleKey = "styleKeyValue"; File file = new File("test.xml"); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilde

我试图创建一个具有结构的新xml,同时通过它添加元素

String styleName = "myStyle";
String styleKey = "styleKeyValue";

File file = new File("test.xml");        

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dbf.newDocumentBuilder();
Document document = builder.newDocument();

Match x = $(document)
                .namespace("s", "http://www.mycompany.com/data")
                .append(
                    $("Data",
                        $("Styles",
                            $("Style",
                                $("Attributes", "")
                            ).attr("name", styleName)
                        )
                    )
                );

Match xpath = x.xpath("//s:Attributes");

xpath = xpath.append($("Attribute", "").attr("key", styleKey));

x.write(file);
然而,append似乎没有添加任何内容,结果是一个空文件。
此方法基于“Document Document=$(file).Document();”行,但该行给了我一个例外,因为该文件不存在-因此使用DocumentBuilder


当然,我意识到我可以通过许多其他方法来创建新的xml文件,我目前正在尝试使用基于Joox的方法

这里的问题是对什么起作用的误解。让我们这样看

草案内容如下:

将内容附加到匹配元素集中每个元素内容的末尾

现在,如果您这样做:

Match x = $(document);
这只是将现有文档包装在jOOX包装器中以供进一步处理。这个
匹配
包装器根本不匹配任何元素,因为包装的
文档
中没有元素,甚至没有根元素(您创建了一个新元素)。因此,为了实际创建包含元素的文档,您必须:

  • 或者使用domapi创建根元素
  • 或者一直使用jOOX,如下所示:

    Match x = $("Data",
                $("Styles",
                  $("Style",
                    $("Attributes", "")
                   ).attr("name", styleName)
                 )
               );
    
请注意,您的通话没有您希望的效果。目前无法在jOOX生成的元素上设置名称空间。这是此功能的挂起功能请求:

Match.namespace()
方法只是将名称空间绑定到匹配上下文中的前缀,用于后续的
xpath()
调用。下面是该方法的Javadoc摘录:

为后续XPath调用获取具有添加的命名空间配置的新匹配


Lucas Eder反馈后的工作版本(Joox“一路”选项)

产生以下结果:

<Data xmlns="http://www.mycompany.com/data">
    <Styles>
        <Style name="myStyle">
            <Attributes>
                <Attribute key="styleKeyValue"/>
            </Attributes>
        </Style>
    </Styles>
</Data>


好的,谢谢-我理解。我想我是在期待一场失败的比赛引发异常。我意识到我本可以使用“if(x.isEmpty()”,但这会妨碍方法链接样式。我已经按照您建议的思路修改了代码(joox all-way选项),并使其正常工作-将添加为问题的编辑。@Dazed:好主意,顺便说一句,您可以在这里提供关于堆栈溢出的自己的答案。这是建议您最终解决方案的推荐方式,而不是为此编辑问题。。。
<Data xmlns="http://www.mycompany.com/data">
    <Styles>
        <Style name="myStyle">
            <Attributes>
                <Attribute key="styleKeyValue"/>
            </Attributes>
        </Style>
    </Styles>
</Data>