Open XML - куда делся мой префикс? - PullRequest
0 голосов
/ 28 июня 2010

Во время отладки вновь созданный элемент имеет префикс как w:, но Xmldoc в конце теряет его.

Результирующий InnerXML для элемента ниже: <altChunk id="FF_HTML" xmlns="http://schemas.openxmlformats.org/wordprocessingml/2006/main" />

Ожидаемый результат: <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;
}

Ответы [ 2 ]

1 голос
/ 28 июня 2010

Префикс является только псевдонимом для пространства имен. Сам префикс не имеет значения. Вы можете использовать «префикс» в качестве префикса, если хотите, и это будет означать точно то же самое.

Точно такой же результат может быть получен из xmlns = "...", который вы указали в своем вопросе. Это означает то же самое, что и с префиксом «w:», если предположить, что «w» был связан с тем же пространством имен.

0 голосов
/ 28 июня 2010

Хорошо, я исправил это:

        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;       
    }
...