Я извлекаю метаданные из изображений PNG, используя javax.imageio. Это прекрасно работает. Но метод getAsTree для доступа к фактическим метаданным возвращает недопустимый XML. Поэтому я не знаю, как разобрать этот XML, чтобы получить определенные метаданные:
run:
Format name: javax_imageio_png_1.0
<javax_imageio_png_1.0>
<IHDR width="256" height="256" bitDepth="8" colorType="RGBAlpha" compressionMethod="deflate" filterMethod="adaptive" interlaceMethod="none"/>
<cHRM whitePointX="31269" whitePointY="32899" redX="63999" redY="33001" greenX="30000" greenY="60000" blueX="15000" blueY="5999"/>
<gAMA value="45454"/>
<iTXt>
<iTXtEntry keyword="XML:com.adobe.xmp" compressionFlag="FALSE" compressionMethod="0" languageTag="" translatedKeyword="" text="<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:lr="http://ns.adobe.com/lightroom/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmp:MetadataDate="2012-12-05T21:36:19+01:00"
xmpMM:InstanceID="xmp.iid:EF7F11740720681192B08F682498C71D"
xmpMM:DocumentID="xmp.did:FC7F11740720681192B0AE5890E66CAE"
xmpMM:OriginalDocumentID="xmp.did:FC7F11740720681192B0AE5890E66CAE">
<xmpMM:History>
<rdf:Seq>
<rdf:li
stEvt:action="saved"
stEvt:instanceID="xmp.iid:FC7F11740720681192B0AE5890E66CAE"
stEvt:when="2012-12-04T00:23:34+01:00"
stEvt:changed="/metadata"/>
<rdf:li
stEvt:action="saved"
stEvt:instanceID="xmp.iid:EF7F11740720681192B08F682498C71D"
stEvt:when="2012-12-05T21:36:19+01:00"
stEvt:changed="/metadata"/>
</rdf:Seq>
</xmpMM:History>
<lr:hierarchicalSubject>
<rdf:Bag>
<rdf:li>Component|Software</rdf:li>
<rdf:li>Places|Paris</rdf:li>
<rdf:li>Product|Christensen</rdf:li>
<rdf:li>Product|Simba</rdf:li>
</rdf:Bag>
</lr:hierarchicalSubject>
<dc:subject>
<rdf:Bag>
<rdf:li>Christensen</rdf:li>
<rdf:li>Paris</rdf:li>
<rdf:li>Simba</rdf:li>
<rdf:li>Software</rdf:li>
</rdf:Bag>
</dc:subject>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="r"?>"/>
</iTXt>
<pHYs pixelsPerUnitXAxis="2835" pixelsPerUnitYAxis="2835" unitSpecifier="meter"/>
</javax_imageio_png_1.0>
Format name: javax_imageio_1.0
<javax_imageio_1.0>
<Chroma>
<ColorSpaceType name="RGB"/>
<NumChannels value="4"/>
<Gamma value="0.45453998"/>
<BlackIsZero value="TRUE"/>
</Chroma>
<Compression>
<CompressionTypeName value="deflate"/>
<Lossless value="TRUE"/>
<NumProgressiveScans value="1"/>
</Compression>
<Data>
<PlanarConfiguration value="PixelInterleaved"/>
<SampleFormat value="UnsignedIntegral"/>
<BitsPerSample value="8 8 8 8"/>
</Data>
<Dimension>
<PixelAspectRatio value="1.0"/>
<ImageOrientation value="Normal"/>
<HorizontalPixelSize value="0.35273367"/>
<VerticalPixelSize value="0.35273367"/>
</Dimension>
<Text>
<TextEntry keyword="XML:com.adobe.xmp" value="<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:lr="http://ns.adobe.com/lightroom/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmp:MetadataDate="2012-12-05T21:36:19+01:00"
xmpMM:InstanceID="xmp.iid:EF7F11740720681192B08F682498C71D"
xmpMM:DocumentID="xmp.did:FC7F11740720681192B0AE5890E66CAE"
xmpMM:OriginalDocumentID="xmp.did:FC7F11740720681192B0AE5890E66CAE">
<xmpMM:History>
<rdf:Seq>
<rdf:li
stEvt:action="saved"
stEvt:instanceID="xmp.iid:FC7F11740720681192B0AE5890E66CAE"
stEvt:when="2012-12-04T00:23:34+01:00"
stEvt:changed="/metadata"/>
<rdf:li
stEvt:action="saved"
stEvt:instanceID="xmp.iid:EF7F11740720681192B08F682498C71D"
stEvt:when="2012-12-05T21:36:19+01:00"
stEvt:changed="/metadata"/>
</rdf:Seq>
</xmpMM:History>
<lr:hierarchicalSubject>
<rdf:Bag>
<rdf:li>Component|Software</rdf:li>
<rdf:li>Places|Paris</rdf:li>
<rdf:li>Product|Christensen</rdf:li>
<rdf:li>Product|Simba</rdf:li>
</rdf:Bag>
</lr:hierarchicalSubject>
<dc:subject>
<rdf:Bag>
<rdf:li>Christensen</rdf:li>
<rdf:li>Paris</rdf:li>
<rdf:li>Simba</rdf:li>
<rdf:li>Software</rdf:li>
</rdf:Bag>
</dc:subject>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="r"?>" language="" compression="none"/>
</Text>
<Transparency>
<Alpha value="nonpremultipled"/>
</Transparency>
</javax_imageio_1.0>
BUILD SUCCESSFUL (total time: 3 seconds)
Недопустимый XML начинается с элемента iTXtEntry, который имеет бит xpacket и заключает в себе дочерние элементы, хотя он имеет формат самозакрывающегося тега вместо конечного тега. Поэтому, когда я пытаюсь проанализировать это с помощью документа DOM и xpath, я получаю сообщение об ошибке, говорящее, что этот элемент не может содержать «>» в содержимом элемента.
Я отключил проверку DTD на DocumentBuilderFactory. Это не помогает. Я чувствую, что использую регулярное выражение, но это не кажется правильным. Почему я получаю недопустимый XML в первую очередь из метода getAsTree в imageio и что я могу с этим поделать?
javax.imageio
— это не анализируемая строка xml, а DOM-дерево в памяти, поэтому они не могут быть недействительными, поскольку недействительность относится к анализу. Если вы имеете в виду, что эта строка, которую я разместил на этой странице, недействительна, то проблема заключается в том, что вы делаете для сериализации полученного узла DOM. Вы должны показать этот код. - person Francis Avila   schedule 06.12.2012Node
изgetAsTree
. Покажите свой код сериализации или используйте этот код в качестве примера. - person Francis Avila   schedule 06.12.2012text="<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
, но это явно не так. Да, странно помещать полный xml-документ в виде текста в значение атрибута, но это не является препятствием для достоверности. - person Francis Avila   schedule 06.12.2012