2009-11-17 7 views
4

Je travaille avec Linq to 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 en ajoutant un préfixe sur un XElement. Mon code ressemble:Préfixes Linq to Xml et Namespace

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 les accessoires avant l'ajout est:

<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" /> 

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

<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"> 
    <property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="test"> 
    <lpwstr xmlns="http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes">test value</lpwstr> 
    </property> 
</Properties> 

Au sein l'élément de propriété que je devrais obtenir

<vt:lpwstr>test value</vt:lpwstr> 

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

Répondre

1

À un certain endroit dans le XElement, vous aurez besoin du préfixe défini. Voici comment le faire en mettant les vt xmlns en haut, en ajoutant comme un XAttribute: New 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")) 

littéraux XML et les espaces de noms global peut être plus facile, mais vous aurez toujours besoin vt figurant dans le fichier XML à un niveau parent. Voici un exemple XML littéraux (souvenez-vous de mettre les deux déclarations des importations en haut de la classe/module, ci-dessus tout le reste):

Imports <xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"> 
Imports <xmlns:vt="http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"> 
    Sub GetXml() 
     Dim formatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" 
     Dim pid = "2" 
     Dim props2 = <Properties> 
         <property fmtid=<%= formatId %> pid=<%= pid + 1 %> name="test"> 
          <vt:lpwstr>test value</vt:lpwstr> 
         </property> 
        </Properties> 
     MsgBox(props2.ToString) 
    End Sub 
2

Cette page peut vous orienter dans la bonne direction http://msdn.microsoft.com/en-us/library/bb387069.aspx

+0

Salut Jarret, Merci pour le lien. J'ai regardé ce lien et beaucoup d'autres liens similaires. Ce lien concerne C# en particulier. Maintenant, alors que vous vous attendez à ce que la sortie de Linq vers Xml soit exactement la même en C# et Vb.Net, ce n'est pas le cas. Vb.Ne essaie de travailler si vous avez besoin de la déclaration d'espace de nom pour vous. Dans mon cas, je ne sais pas, mais je ne sais pas comment récupérer le contrôle. – Andrew

1

La façon dont je l'ai trouvé pour contrôler où les namepaces sont déclarés est d'utiliser littéraux Xml. Je dois également recréer le document à partir de zéro et copier toute information existante de l'ancien document dans mon document nouvellement créé, ce qui n'est pas idéal. Il y a également un bogue dans l'exemple ci-dessus qui est suffisant pour que l'un des documents Office soit corrompu après l'exécution du code.

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

Devrait être

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

Bienvenue sur StackOverflow Andrew! Vous pouvez répondre à votre propre question, mais lorsque vous fournissez simplement plus d'informations, il est préférable de modifier votre question. – CoderDennis