Java 使用jdom/dom4j浏览DOM,而不需要太多地了解名称空间

Java 使用jdom/dom4j浏览DOM,而不需要太多地了解名称空间,java,xml,jpeg,jdom,dom4j,Java,Xml,Jpeg,Jdom,Dom4j,我从JPEG图像中获得了一些xmp XML,我想读取并更新其中的元数据。我已经编写了一个漂亮的SAX解析器,它可以读取数据,但后来我意识到我不能用它更新数据 所以我去了dom4j。当我试图用它解析XML时,它抛出了一个关于未知名称空间的异常。一个“直接开发人员”,我只需要手动添加这些名称空间,但是如果我遇到一个具有不同名称空间url的图像怎么办?我就没办法应付了 然后我尝试了jdom。它成功地创建了文档,但同样,我需要知道一个名称空间url,以便获得一个子标记。下面是我所说内容的一个快速示例:

我从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#"))
那么,我应该怎么做才能解决我的问题呢

  • 祈祷url的一切都是一样的吗
  • 手动更新
  • 找到一个不关心名称空间的库
  • 下面是一个xmp XML示例:

    <?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
    
    您的任何选项都不会有帮助:

  • 如果名称空间URL发生更改,则表示引入了新功能,或者标记或属性的语义发生了更改。您需要了解这些更改,以便进行不破坏任何内容的编辑。如果你特定的神有能力用这种知识引导你,祈祷当然会有所帮助

  • 使用SAX进行解析并不能解决名称空间问题,而且它也不支持更新文档

  • 使用不知道名称空间的解析器可能是最糟糕的选择。如果名称空间URL发生更改,那么您将真的把事情搞砸

  • 总之,您的所有导航和编辑/更新都需要具有名称空间意识。但是,如果使用XPath导航,则可以进行有限的编辑。例如,如果要将列表iten添加到
    元素,可以执行以下操作:

    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);
    

    此示例是用内存编写的,未经测试,因此可能无法编译。

    您的任何选项都不会有帮助:

  • 如果名称空间URL发生更改,则表示引入了新功能,或者标记或属性的语义发生了更改。您需要了解这些更改,以便进行不破坏任何内容的编辑。如果你特定的神有能力用这种知识引导你,祈祷当然会有所帮助

  • 使用SAX进行解析并不能解决名称空间问题,而且它也不支持更新文档

  • 使用不知道名称空间的解析器可能是最糟糕的选择。如果名称空间URL发生更改,那么您将真的把事情搞砸

  • 总之,您的所有导航和编辑/更新都需要具有名称空间意识。但是,如果使用XPath导航,则可以进行有限的编辑。例如,如果要将列表iten添加到
    元素,可以执行以下操作:

    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);
    

    这个例子是用内存编写的,没有经过测试,所以它甚至可能无法编译。

    如果你给出解决方案,我会投赞成票。“或者解释他需要做什么。”罗曼尼希波同意。如果你给出一个解决方案,我会投赞成票。或者解释了他需要做什么。