我们如何使用XmlDocument类为xml元素设置值

时间:2021-12-09 00:47:59

Is it possible to set value dynamically for any XML element using the XmlDocument class? Suppose my XML is

是否可以使用XmlDocument类为任何XML元素动态设置值?假设我的XML是

    <?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <env:Header xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
    <soapenv:Body>
        <v9:ProcessShipmentReply xmlns:v9="http://fedex.com/ws/ship/v9">
            <v9:HighestSeverity xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SUCCESS</v9:HighestSeverity>
            <v9:Notifications xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                <v9:Severity>SUCCESS</v9:Severity>
                <v9:Source>ship</v9:Source>
                <v9:Code>0000</v9:Code>
                <v9:Message>Success</v9:Message>
                <v9:LocalizedMessage>Success</v9:LocalizedMessage>
            </v9:Notifications>
            <v9:CompletedShipmentDetail>
                <v9:CompletedPackageDetails xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                    <v9:SequenceNumber>1</v9:SequenceNumber>
                    <v9:TrackingIds>
                        <v9:TrackingIdType>GROUND</v9:TrackingIdType>
                        <v9:TrackingNumber>634649515000016</v9:TrackingNumber>
                    </v9:TrackingIds>
                    <v9:Barcodes>
                        <v9:BinaryBarcodes>
                            <v9:Type>COMMON_2D</v9:Type>
                            <v9:Value>Wyk+HjAxHTAyMDI3ODAdODQwHTEzNx02MzQ2NDk1</v9:Value>
                        </v9:BinaryBarcodes>
                        <v9:StringBarcodes>
                            <v9:Type>GROUND</v9:Type>
                            <v9:Value>9612137634649515000016</v9:Value>
                        </v9:StringBarcodes>
                    </v9:Barcodes>
                    <v9:Label>
                        <v9:Type>OUTBOUND_LABEL</v9:Type>
                        <v9:ShippingDocumentDisposition>RETURNED</v9:ShippingDocumentDisposition>
                        <v9:Resolution>200</v9:Resolution>
                        <v9:CopiesToPrint>1</v9:CopiesToPrint>
                        <v9:Parts>
                            <v9:DocumentPartSequenceNumber>1</v9:DocumentPartSequenceNumber>
                            <v9:Image>iVBORw0KGgoAAAANSUhEUgAAAyAAAASwAQAAAAAryhMIAAAagEl</v9:Image>
                        </v9:Parts>
                    </v9:Label>
                </v9:CompletedPackageDetails>
            </v9:CompletedShipmentDetail>
        </v9:ProcessShipmentReply>
    </soapenv:Body>

How could I set value for the below element like

我怎样才能为下面的元素设置值

<v9:Severity>SUCCESS</v9:Severity>
<v9:Source>ship</v9:Source>

I know how to extract data from XML and I think it is also possible to set value for the XML element using XMLDocument class. Looking for guidance.

我知道如何从XML中提取数据,我认为也可以使用XMLDocument类为XML元素设置值。寻找指导。

2 个解决方案

#1


22  

If you know how to select a value, then you probably know how to update one too.

如果您知道如何选择值,那么您可能也知道如何更新值。

XmlDocument doc = new XmlDocument();
doc.Load(...);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("v9", "http://fedex.com/ws/ship/v9");

XmlNode severityNode = doc.SelectSingleNode("//v9:Severity", nsMgr);
severityNode.innerText = "FAILURE";

The important thing to know is that the <v9:Severity> node has an inner text() node, so in the example above you can't use the Node.Value property. To do that you would do something like this instead:

重要的是要知道 节点有一个内部text()节点,所以在上面的例子中你不能使用Node.Value属性。要做到这一点,你会做这样的事情: :severity>

XmlNode severityTextNode = doc.SelectSingleNode("//v9:Severity/text()", nsMgr);
severityTextNode.Value = "FAILURE";

Note the subtle differences.

注意细微差别。

#2


0  

Do an XPath to the superior node using the XMLDocument class and add the 2 extra nodes on the tree.

使用XMLDocument类对上级节点执行XPath,并在树上添加2个额外节点。

#1


22  

If you know how to select a value, then you probably know how to update one too.

如果您知道如何选择值,那么您可能也知道如何更新值。

XmlDocument doc = new XmlDocument();
doc.Load(...);
XmlNamespaceManager nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("v9", "http://fedex.com/ws/ship/v9");

XmlNode severityNode = doc.SelectSingleNode("//v9:Severity", nsMgr);
severityNode.innerText = "FAILURE";

The important thing to know is that the <v9:Severity> node has an inner text() node, so in the example above you can't use the Node.Value property. To do that you would do something like this instead:

重要的是要知道 节点有一个内部text()节点,所以在上面的例子中你不能使用Node.Value属性。要做到这一点,你会做这样的事情: :severity>

XmlNode severityTextNode = doc.SelectSingleNode("//v9:Severity/text()", nsMgr);
severityTextNode.Value = "FAILURE";

Note the subtle differences.

注意细微差别。

#2


0  

Do an XPath to the superior node using the XMLDocument class and add the 2 extra nodes on the tree.

使用XMLDocument类对上级节点执行XPath,并在树上添加2个额外节点。