Замена всего XmlElement новым значением - PullRequest
1 голос
/ 22 ноября 2011

Ниже приведен код, в котором я беру html, а затем читаю все ссылки img и a.Обратите внимание, что это C # 2.0.

string xml = "<xhtml>" + inputXhtml + "</xhtml>";
XmlDocument node = new XmlDocument();
node.LoadXml(xml);
foreach (XmlElement element in TemplateUtilities.SelectNodes(node, "//html:img[@xlink:href]|//html:a[@xlink:href]"))
{
    bool flag = element.LocalName == "img";
    lStrCompLinkText = "";
    XmlAttributeCollection attributes = element.Attributes;
    XmlAttribute namedItem = (XmlAttribute)attributes.GetNamedItem("href", "http://www.w3.org/1999/xlink");
    string str2 = namedItem.Value;              
    Component currentObject = engine.GetObject(str2) as Component;
    if (flag)
    {
        element.SetAttribute("src", str2);
    }
    else
    {
        foreach (XmlNode xnode in element.ChildNodes)
        {
            lStrCompLinkText = lStrCompLinkText + xnode.OuterXml;
        }   
        string attr = ComponentBase.ComponentHelper.ComponentLinkAttributes(element, engine);       
        string compLink = ComponentBase.ComponentHelper.DisplayPublishedComponentLink(currentObject, lStrCompLinkText, attr, engine, package, pageObject);

        attributes.RemoveNamedItem("href", "http://www.tridion.com/ContentManager/5.0");
        //Here I want to replace whole element with the compLink
    }
    attributes.RemoveNamedItem("href", "http://www.w3.org/1999/xlink");
    attributes.RemoveNamedItem("type", "http://www.w3.org/1999/xlink");
    attributes.RemoveNamedItem("title", "http://www.w3.org/1999/xlink");
}

Теперь я хочу переместить мой элемент с новым значением compLink и добавить обратно к входному HTML

Пожалуйста, предложите

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Я решил вышеупомянутую проблему, используя следующую логику:

XmlDocument lObjTCDCodeDom = new XmlDocument();
lObjTCDCodeDom.LoadXml("<TCDCode/>");
lObjTCDCodeDom.DocumentElement.InnerText = compLink;
element.ParentNode.ReplaceChild(node.ImportNode(lObjTCDCodeDom.DocumentElement, true), element);

, а затем написал XSLT, который проверяет <TCDCode/> и заменяет его, а затем я получаю актуальный обновленный XML.

1 голос
/ 22 ноября 2011

В том месте, где появляется ваш комментарий "// Здесь я хочу заменить", сделайте следующее.

Создайте документ XML из содержимого compLink (при условии, что это XML).

XmlDocument xmlTemp = new XmlDocument();
xmlTemp.loadXml( compLink );

Удалите исходный элемент из его родительского элемента со следующим кодом

XmlNode ndParent = element.ParentNode;
ndParent.RemoveChild( element);

Импортируйте и добавьте новый xmlTemp к родительскому элементу

XmlNode ndImport = ndParent.OwnerDocument.ImportNode( xmlTemp.documentElement, true );
ndParent.AppendChild( ndImport.CloneNode( true ) );
...