gpt4 book ai didi

java - 使用 XOM 生成带有命名空间的 XML 部分

转载 作者:行者123 更新时间:2023-12-02 00:03:55 24 4
gpt4 key购买 nike

虽然描述看起来很长,但实际上很简单。

我需要什么

我有以下 xml 文档

<?xml version="1.0" encoding="UTF-8"?>
<atom:feed xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:atom="http://www.w3.org/2005/Atom" type="application/atom+xml;type=feed">
<atom:link rel="self" href="http://hostname/thirdparty/playlist"/>
<atom:id>vuter id</atom:id>
<atom:title>Untitled</atom:title>
<opensearch:totalResults>249</opensearch:totalResults>
<opensearch:startIndex>1</opensearch:startIndex>
<opensearch:itemsPerPage>249</opensearch:itemsPerPage>
<atom:entry type="application/atom+xml;type=entry">
<atom:id>12345678</atom:id>
<atom:title>Playlist example 1</atom:title>
<atom:link rel="self" type="application/atom+xml;type=entry" href="http://hostname/thirdparty/playlist/2101211130000011141"/>
<dcterms:identifier>2101211130000011141</dcterms:identifier>
</atom:entry>
<atom:entry type="application/atom+xml;type=entry">
<atom:id>12345678</atom:id>
<atom:title>Playlist example 2</atom:title>
<atom:link rel="self" type="application/atom+xml;type=entry" href="http://hostname/thirdparty/playlist/2101211090000000341"/>
<dcterms:identifier>2101211090000000341</dcterms:identifier>
</atom:entry>
</atom:feed>

请注意,xml 基本上包含三个命名空间

现在我需要生成单个 atom:entry 节点的另一个 xml 文档。就像下面这样

<atom:entry type="application/atom+xml;type=entry" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:atom="http://www.w3.org/2005/Atom">
<atom:id>12345678</atom:id>
<atom:title>Playlist example 1</atom:title>
<atom:link rel="self" type="application/atom+xml;type=entry" href="http://hostname/thirdparty/playlist/2101211130000011141"/>
<dcterms:identifier>2101211130000011141</dcterms:identifier>
</atom:entry>
<小时/>

我得到了什么

我正在使用XOM,到目前为止我已经尝试过

Element rootElem = new Builder().build(ins).getRootElement();
xc = XPathContext.makeNamespaceContext(rootElem);
Element firstEntry = (Element) rootElem.query("atom:entry", xc).get(0);
Document doc = new Document((Element)firstEntry.copy());
System.out.println(doc.toXML());

我得到的 xml 只包含一个命名空间声明。就像下面这样。

<?xml version="1.0"?>
<atom:entry xmlns:atom="http://www.w3.org/2005/Atom" type="application/atom+xml;type=entry">
<atom:id>12345678</atom:id>
<atom:title>Playlist example 1</atom:title>
<atom:link rel="self" type="application/atom+xml;type=entry" href="http://hostname/thirdparty/playlist/2101211130000011141" />
<dcterms:identifier xmlns:dcterms="http://purl.org/dc/terms/">2101211130000011141</dcterms:identifier>
</atom:entry>
<小时/>

问题

它仅包含 Atom 命名空间:(因此它不是有效的 XML。因为它有一个缺少命名空间的子节点 dcterms:identifier

我非常需要帮助才能摆脱这个问题。期待任何帮助。

最佳答案

没有问题。 dcterms 命名空间在需要的地方声明:在 dcterms:identifier 标记中

<dcterms:identifier xmlns:dcterms="http://purl.org/dc/terms/">

事实上,你期望的xml和你得到的xml是一样的。命名空间不在同一位置声明的事实不会影响 xml 内容的含义。

======更新========

我建议解决真正的问题,即您的系统不接受有效的 xml(或者它不能正确解释它们)这一事实。作为针对您的情况的修复,请尝试以下代码:

Element rootElem = new Builder().build(ins).getRootElement();
XPathContext xc = XPathContext.makeNamespaceContext(rootElem);
Element firstEntry = (Element) rootElem.query("atom:entry", xc).get(0);
Document doc = new Document((Element)firstEntry.copy());
Element root = doc.getRootElement();
recursive(root,root);

static void recursive(Element root, Element child){
root.addNamespaceDeclaration(child.getNamespacePrefix(), child.getNamespaceURI());
if (child.getChildElements().size()>0){
int i = child.getChildElements().size();
for (int k=0;k<i;k++){
recursive(root,child.getChildElements().get(k));
}
}
}

基本上,上面的代码会遍历所有子级,标识那里的命名空间并将其添加到根作为命名空间声明。我已经尝试过并成功了。我希望它能解决您的问题

关于java - 使用 XOM 生成带有命名空间的 XML 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14272447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com