Avatar billede ladefoged Nybegynder
02. marts 2012 - 11:21 Der er 3 kommentarer og
1 løsning

Læs XMP i C# .net

Jeg har følgende xmp fra et billede:
<?xpacket begin="?" id="W5M0MpCehiHzreSzNTczkc9d"?>
    <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.1.2">
        <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/">
                <dc:subject>
                    <rdf:Bag>
                        <rdf:li>Børnehaven Himmelblå</rdf:li>
                        <rdf:li>Broager</rdf:li>
                    </rdf:Bag>
                </dc:subject>
            </rdf:Description>
        </rdf:RDF>
    </x:xmpmeta>
<?xpacket end="w"?>

Som jeg forsøger at læse via nedenstående kode, kommer dog ingenting i nodeList. Nogen der har en idé til hvad der er galt?

XmlDocument document = new XmlDocument();
document.LoadXml(xmp);

XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);
manager.AddNamespace("rdf", "http://purl.org/dc/elements/1.1/");
manager.AddNamespace("dc", "");

string query = "/rdf:Description/dc:subject/rdf:Bag";
XmlNodeList nodeList = document.SelectNodes(query, manager);

foreach (XmlNode node in nodeList)
{
    MessageBox.Show(node.InnerText);
}

Koderne kan findes i lidt mere læsevenlig format her
XMP: http://snipt.org/uZfi3
C#: http://snipt.org/uZfh6
Avatar billede bvli Praktikant
02. marts 2012 - 11:47 #1
Men mangler du ikke at tilføje namespacet 'x'?

Og din xpath skal vel så være '/x:xmpmeta/rdf:Description/dc:subject/rdf:Bag

Det er godt nok lang tid siden jeg har rodet med XmlDocument/XPath. Linq/xml er for genialt. Har du overvejet at kigge på det?
Avatar billede ladefoged Nybegynder
02. marts 2012 - 12:09 #2
Tak for dit svar, jeg prøver det lige efter frokost.

Jeg har overvejet Linq men synes ikke det virkede så nemt i dette tilfælde, men kan jo være jeg bare er kommet forkert ind i det, vil du eventuelt give et eksempel på hvordan man kunne løse mit problem via Linq/xml?
Avatar billede ladefoged Nybegynder
02. marts 2012 - 13:30 #3
Så kom jeg frem til en løsning, den endte med at blive i Linq


StringReader xmpStream = new StringReader(xmp);

XDocument loaded = XDocument.Load(xmpStream);
XNamespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";

// Query the data and write out a subset of contacts
var q = from c in loaded.Descendants(rdf + "li")
        where (string)c.Value != ""
        select (string)c.Value;


foreach (string name in q)
{
    MessageBox.Show(name);
}

Koden i mere læsevenligt format http://snipt.org/uZgj6
Avatar billede arne_v Ekspert
04. marts 2012 - 04:18 #4
Jeg kan ikke se den store fordel ved LINQ for XML over XPath her.

using System;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

namespace E
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // XmLDocument
            XmlDocument doc = new XmlDocument();
            doc.Load(@"C:\work\rdf.xml");
            XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
            mgr.AddNamespace("x", "adobe:ns:meta/");
            mgr.AddNamespace("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
            mgr.AddNamespace("dc", "http://purl.org/dc/elements/1.1/");
            foreach(XmlNode n in doc.SelectNodes("/x:xmpmeta/rdf:RDF/rdf:Description/dc:subject/rdf:Bag/rdf:li/text()", mgr))
            {
                Console.WriteLine(n.Value);
            }
            foreach(XmlNode n in doc.GetElementsByTagName("rdf:li"))
            {
                Console.WriteLine(n.FirstChild.Value);
            }
            // XDocument
            XDocument xd = XDocument.Load(@"C:\work\rdf.xml");
            XNamespace x = "adobe:ns:meta/";
            XNamespace rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
            XNamespace dc = "http://purl.org/dc/elements/1.1/";
            foreach(XText n in xd.Element(x + "xmpmeta").Elements(rdf + "RDF").Elements(rdf + "Description").Elements(dc + "subject").Elements(rdf + "Bag").Elements(rdf + "li").DescendantNodes())
            {
                Console.WriteLine(n.Value);
            }
            foreach(XText n in xd.Descendants(rdf + "li").DescendantNodes())
            {
                Console.WriteLine(n.Value);
            }
            Console.ReadKey();
        }
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I dag 16:05 win 10 vil ikke boote Af bb69 i Windows
I dag 11:20 Lenovo x390 Af tobberjas i PC
I dag 10:14 Alder i Excel Af Nanarsi i Excel
I dag 09:00 Flere linier på faneblad Af Peder Lund Nielsen i Excel
I går 21:35 Flash Player Af ErikHg i Andet software