4 votes

Linq to Xml et les préfixes d'espace de noms

Je travaille avec Linq sur Xml pour manipuler des documents openXml. Plus précisément, j'essaie de lire et d'écrire dans les propriétés personnalisées des documents. J'ai actuellement un problème pour ajouter un préfixe à un XElement. Mon code ressemble à ceci :

Dim main as XNameSpace = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"

Dim vt as XNameSpace = "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"

Dim props as XElement = cXDoc.Element(main + "Properties"
        props.Add(New XElement(main + "property"), _
                               New XAttribute("fmtid", formatId), _
                               New XAttribute("pid", pid + 1), _
                               New XAttribute("name", "test"), _
                                    New XElement(vt + "lpwstr", "test value")) _
                 )

Le Xml contenu dans props avant l'ajout est :

Le Xml après l'appel à la méthode props.add() est :

    test value

Dans l'élément property, je devrais obtenir

test value 

mais je n'arrive tout simplement pas à y arriver. Je ne veux pas non plus de l'attribut xmlns pour cet élément ici. Je pense que je dois d'une manière ou d'une autre faire correspondre l'espace de noms vt à la déclaration d'espace de noms dans l'élément racine "Properties". Est-ce que quelqu'un a des suggestions ?

2voto

Jarrett Widman Points 3677

Cette page pourrait vous indiquer la bonne direction http://msdn.microsoft.com/en-us/library/bb387069.aspx

2voto

Todd Main Points 24036

À un endroit dans l'élément XElement, vous aurez besoin du préfixe défini. Voici comment le faire en plaçant le vt xmlns en haut, en l'ajoutant en tant qu'XAttribute : Nouvel XAttribute(XNamespace.Xmlns + "vt", "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes")

Dim main As XNamespace = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
Dim vt As XNamespace = "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"
Dim formatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"
Dim pid = "2"
Dim props As New XElement(main + "Properties", New XAttribute(XNamespace.Xmlns + "vt", "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"))
props.Add(New XElement(main + "property"), _
                       New XAttribute("fmtid", formatId), _
                       New XAttribute("pid", pid + 1), _
                       New XAttribute("name", "test"), _
                            New XElement(vt + "lpwstr", "test value"))

Les littéraux XML et les espaces de noms globaux peuvent être plus faciles, mais vous aurez toujours besoin de vt listé dans le XML à un niveau parent. Voici un exemple de littéraux XML (n'oubliez pas de placer les deux instructions Imports en haut de la classe/module, avant tout le reste) :

Imports 
Imports 
    Sub GetXml()
        Dim formatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"
        Dim pid = "2"
        Dim props2 = 
                          pid=<%= pid + 1 %> name="test">
                             test value

        MsgBox(props2.ToString)
    End Sub

1voto

Andrew Points 2941

La façon dont j'ai trouvé pour contrôler où les espaces de noms sont déclarés est d'utiliser des littéraux XML. Je dois également recréer le document à partir de zéro et copier toutes les informations existantes du vieux document dans mon nouveau document, ce qui n'est pas idéal. Il y a aussi un bug dans l'exemple ci-dessus qui est suffisant pour corrompre n'importe quel document Office après l'exécution du code.

Dim vt as XNameSpace = "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"

Doit lire

Dim vt as XNameSpace = "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X