Java 如何使用Joox创建新的xml文件
我试图创建一个具有结构的新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
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) ) );
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>