2010-06-28 6 views
0

Pendant le débogage, l'élément nouvellement créé a son préfixe comme w:, mais le Xmldoc à la fin le perd.Open XML - où est passé mon préfixe?

La InnerXml résultante pour l'élément ci-dessous est: <altChunk id="FF_HTML" xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main" />

Résultat attendu est <w:altChunk r:id="FF_HTML"/>

private static XmlDocument prepareHTMLChunks(PackagePart partDocumentXML) 
{ 
    XmlDocument doc = new XmlDocument(); 
    Stream xmlStream = partDocumentXML.GetStream(); 
    doc.Load(xmlStream); 

    NameTable nt = new NameTable(); 
    nsManager = new XmlNamespaceManager(nt);    
    nsManager.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main"); 

    XmlNodeList nodeList = doc.SelectNodes("//w:bookmarkStart", nsManager); 
    foreach (XmlNode node in nodeList) 
    { 
     foreach (XmlAttribute attr in node.Attributes) 
     { 
      if (attr.Value.EndsWith("HTML")) 
      { 
       //XmlElement el = doc.CreateElement("w","w:altChunk",string.Empty); 
       XmlElement el = doc.CreateElement("altChunk",nsManager.LookupNamespace("w")); 


       XmlAttribute altChunkAttr = doc.CreateAttribute("r","id",string.Empty); 
       altChunkAttr.Prefix = "r"; 
       altChunkAttr.Value = attr.Value; 
       el.SetAttributeNode(altChunkAttr); 

       XmlNode nodeToReplace = node.ParentNode;       

       XmlNode bodyNode = doc.SelectSingleNode("//w:body", nsManager); 
       bodyNode.ReplaceChild(el, nodeToReplace);       
      }      
     } 
    }    
    return doc; 
} 
+0

Vous pouvez aller de l'avant et d'accepter votre réponse comme correcte. –

Répondre

0

Ok, je l'ai fixé:

 private static XmlDocument prepareHTMLChunks(PackagePart partDocumentXML) 
    { 

     XmlDocument _document = new XmlDocument(); 
     Stream xmlStream = partDocumentXML.GetStream(); 
     _document.Load(xmlStream); 

     XmlNamespaceManager _ns = new XmlNamespaceManager(_document.NameTable); 
     _ns.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main"); 

     XmlNode _body = _document.SelectSingleNode("//w:body", _ns); 

     foreach (XmlNode _node in _document.SelectNodes("//w:bookmarkStart", _ns)) 
     { 
      foreach (XmlAttribute _attribute in _node.Attributes) 
      { 
       if (_attribute.Value.EndsWith("HTML")) 
       { 
        XmlElement _element = _document.CreateElement("w", "altChunk", "http://schemas.openxmlformats.org/wordprocessingml/2006/main"); 
        XmlAttribute _newAttr = _document.CreateAttribute("r", "id", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");       
        _newAttr.Value = _attribute.Value; 
        _element.Attributes.Append(_newAttr); 
        _body.AppendChild(_element);       
       }   
      } 
     }    
     return _document;  
    } 
1

Le préfixe est seulement un alias pour l'espace de noms. Le préfixe lui-même n'a pas d'importance. Vous pouvez utiliser "prefix" comme préfixe si vous le souhaitez, et cela signifierait exactement la même chose. De même, le même résultat peut provenir de xmlns = "..." que vous montrez dans votre question. Cela signifie exactement la même chose qu'avec le préfixe "w:", en supposant que "w" ait été aliasé au même espace de noms.

+0

Je sous-entend votre réponse John, mais comment puis-je obtenir le résultat attendu: et non: Le problème est que sans le préfixes dans le XML, le mot n'ouvre pas le document comme vous pouvez l'imaginer. Merci Fox – Fox

+0

@Fox: quelle version de Word utilisez-vous, et s'il vous plaît poster un peu de XML que vous dites ne s'ouvrira pas sans le préfixe. Je serais extrêmement choqué de constater que Word n'obéit pas aux normes XML de base qui existent depuis plus d'une décennie. –

+0

Tout se trouve avec les préfixes utilisant Word 2007 Ma méthode rend au-dessus de l'élément XML comme pendant que Word attend . Donc, la seule chose que j'essaie de comprendre est de ma méthode ci-dessus, comment obtenir les préfixes dans le XML lors du rendu. – Fox

Questions connexes