使用c#在xml文档中插入节点

时间:2015-08-19 13:42:15

标签: c# xml hp-uft

我试图在特定位置的XML文档中插入XML节点。

这是我的xml:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <readContract xmlns="http://implementation.company.schema.reference">
            <ContactNumbers>10158</ContactNumbers>
            <productGroups>0085</productGroups>
            <indicationBalanceInfo>false</indicationBalanceInfo>
            <indicationBlocked>true</indicationBlocked>
        </readContract>
    </Body>
</Envelope>

我正在尝试在标记<productGroups>0093</productGroups>

下面插入另一个标记<productGroups>0085</productGroups>

期待如下:

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <readContract xmlns="http://implementation.company.schema.reference">
            <ContactNumbers>10158</ContactNumbers>
            <productGroups>0085</productGroups>
            <productGroups>0093</productGroups>
            <indicationBalanceInfo>false</indicationBalanceInfo>
            <indicationBlocked>true</indicationBlocked>
        </readContract>
    </Body>
</Envelope>

使用下面的C#代码来实现它。

XmlDocument doc = new XmlDocument();
string inputxml = this.StServiceCallActivity5.InputEnvelope.InnerXml.ToString();
//Here inputxml contains whole xml document.
string addxml = "<productGroups>0093</productGroups>";
doc.LoadXml(inputxml);
XmlDocumentFragment xmlDocFrag = doc.CreateDocumentFragment();
xmlDocFrag.InnerXml = addxml;
XmlElement parentEle = doc.DocumentElement;
parentEle.AppendChild(xmlDocFrag);

它返回值

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        <readContract xmlns="http://implementation.company.schema.reference">
            <ContactNumbers>10158</ContactNumbers>
            <productGroups>0085</productGroups>
            <productGroups>0093</productGroups>
            <indicationBalanceInfo>false</indicationBalanceInfo>
            <indicationBlocked>true</indicationBlocked>
        </readContract>
    </Body>
    <productGroups xmlns="">0093</productGroups>
</Envelope>

是C#代码的新手,请帮助我按预期获得XML文档。 非常感谢你的帮助。

3 个答案:

答案 0 :(得分:0)

看起来名称空间导致问题。这对我有用:

XmlDocument doc = new XmlDocument();
doc.LoadXml(File.ReadAllText("XMLFile1.xml"));
XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("ns1", "http://schemas.xmlsoap.org/soap/envelope/");
ns.AddNamespace("ns2", "http://implementation.company.schema.reference");
var rootNode = doc.SelectSingleNode("//ns1:Envelope", ns);
var readContractNode = rootNode.FirstChild.FirstChild;
var newNode = doc.CreateNode(XmlNodeType.Element, "productGroups", "http://implementation.company.schema.reference");
newNode.InnerText = "0093";
readContractNode.InsertAfter(newNode, readContractNode.SelectSingleNode("//ns2:productGroups", ns));

或者,如果你不喜欢像我这样的名字命名空间,你可以多尝试一下&#34; brute-forcy&#34;的方法:

XmlDocument doc = new XmlDocument();
doc.LoadXml(File.ReadAllText("XMLFile1.xml"));
var newNode = doc.CreateNode(XmlNodeType.Element, "productGroups", "http://implementation.company.schema.reference");
newNode.InnerText = "0093";
doc.FirstChild.FirstChild.FirstChild.InsertAfter(newNode, doc.FirstChild.FirstChild.FirstChild.FirstChild.NextSibling);

它可以进行优化,但我认为有必要指出根本原因是文档中的不同命名空间。

答案 1 :(得分:0)

执行此操作时:

XmlElement parentEle = doc.DocumentElement;
parentEle.AppendChild(xmlDocFrag);

您将节点附加到文档的根目录。您可能希望选择该项应附加到的实际readContract节点。举个例子:

XmlNode newNode = doc.CreateNode(XmlNodeType.Element, "productGroup", "");
newNode.InnerText = "something";

XmlNode readContractNode = doc["Envelope"]["Body"]["readContract"];
XmlElement groups = readContractNode["productGroups"];
readContractNode.InsertAfter(newNode, groups);

当然,你可能想要处理已有多个子productGroup元素的情况,但想法是一样的。

答案 2 :(得分:0)

您可能想要使用 XmlNode.InsertAfter方法

public virtual XmlNode InsertAfter(
    XmlNode newChild,
    XmlNode refChild
)

哪里

newChild = The XmlNode to insert

refChild = The XmlNode that is the reference node. The newNode is placed after the refNode

请查看 this 链接以获取相关信息。

并检查 this 链接以及 SO 上的回答。

<强> P.S。
在发布新问题之前,请务必检查其他答案。