Java 使用jdom/dom4j浏览DOM,而不需要太多地了解名称空间
我从JPEG图像中获得了一些xmp XML,我想读取并更新其中的元数据。我已经编写了一个漂亮的SAX解析器,它可以读取数据,但后来我意识到我不能用它更新数据 所以我去了dom4j。当我试图用它解析XML时,它抛出了一个关于未知名称空间的异常。一个“直接开发人员”,我只需要手动添加这些名称空间,但是如果我遇到一个具有不同名称空间url的图像怎么办?我就没办法应付了 然后我尝试了jdom。它成功地创建了文档,但同样,我需要知道一个名称空间url,以便获得一个子标记。下面是我所说内容的一个快速示例:Java 使用jdom/dom4j浏览DOM,而不需要太多地了解名称空间,java,xml,jpeg,jdom,dom4j,Java,Xml,Jpeg,Jdom,Dom4j,我从JPEG图像中获得了一些xmp XML,我想读取并更新其中的元数据。我已经编写了一个漂亮的SAX解析器,它可以读取数据,但后来我意识到我不能用它更新数据 所以我去了dom4j。当我试图用它解析XML时,它抛出了一个关于未知名称空间的异常。一个“直接开发人员”,我只需要手动添加这些名称空间,但是如果我遇到一个具有不同名称空间url的图像怎么办?我就没办法应付了 然后我尝试了jdom。它成功地创建了文档,但同样,我需要知道一个名称空间url,以便获得一个子标记。下面是我所说内容的一个快速示例:
document.getRootElement().getChild("RDF", Namespace.getNamespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#"))
那么,我应该怎么做才能解决我的问题呢
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c011 79.156380, 2014/05/21-23:38:37 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmlns:exifEX="http://cipa.jp/exif/1.0/" dc:format="image/jpeg" xmp:CreatorTool="Image Data Converter" xmp:ModifyDate="2015-12-25T22:43:26" xmp:CreateDate="2015-12-18T17:02:15" xmp:MetadataDate="2016-02-03T00:31:43+03:00" photoshop:DateCreated="2015-12-18T17:02:15" xmpMM:DocumentID="8845A702F6819ABAE2AF7D36E005DFDF" xmpMM:OriginalDocumentID="8845A702F6819ABAE2AF7D36E005DFDF" xmpMM:InstanceID="xmp.iid:f27bf752-4ea3-df4c-9c2a-b9837267e444" exifEX:PhotographicSensitivity="800">
<dc:description>
<rdf:Alt>
<rdf:li xml:lang="x-default">dEscription</rdf:li>
</rdf:Alt>
</dc:description>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">nAme</rdf:li>
</rdf:Alt>
</dc:title>
<dc:creator>
<rdf:Seq>
<rdf:li>aUthor</rdf:li>
</rdf:Seq>
</dc:creator>
<dc:subject>
<rdf:Bag>
<rdf:li>kEyword</rdf:li>
<rdf:li>keYwords2</rdf:li>
</rdf:Bag>
</dc:subject>
<xmpMM:History>
<rdf:Seq>
<rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:b6e2ef4c-c0fe-7549-8c9e-b8b8fe89f1ff" stEvt:when="2016-02-02T22:37:17+03:00" stEvt:softwareAgent="Adobe Photoshop Camera Raw 9.4" stEvt:changed="/metadata"/>
<rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:f27bf752-4ea3-df4c-9c2a-b9837267e444" stEvt:when="2016-02-03T00:31:43+03:00" stEvt:softwareAgent="Adobe Photoshop Camera Raw 9.4 (Windows)" stEvt:changed="/metadata"/>
</rdf:Seq>
</xmpMM:History>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
描述
名称
作者
关键词
关键词2
您的任何选项都不会有帮助:
元素,可以执行以下操作:
String expression = "//*[local-name() = 'subject']/*[local-name() = 'Bag']";
Element bag = (Element) XPathFactory.instance().compile().evaluateFirst(document);
Element listItem = new Element("li", bag.getNamespace()).setText("...");
bag.addContent(listItem);
此示例是用内存编写的,未经测试,因此可能无法编译。您的任何选项都不会有帮助:
元素,可以执行以下操作:
String expression = "//*[local-name() = 'subject']/*[local-name() = 'Bag']";
Element bag = (Element) XPathFactory.instance().compile().evaluateFirst(document);
Element listItem = new Element("li", bag.getNamespace()).setText("...");
bag.addContent(listItem);
这个例子是用内存编写的,没有经过测试,所以它甚至可能无法编译。如果你给出解决方案,我会投赞成票。“或者解释他需要做什么。”罗曼尼希波同意。如果你给出一个解决方案,我会投赞成票。或者解释了他需要做什么。