首页 > 解决方案 > Linq XML 更改参数

问题描述

我有一个 xml 请求正文,如下所示:

<s:Envelope xmlns:s="url1">
    <s:Body>
        <GetCustomerFunctions xmlns="url2">
            <CustomerFunctionRequest xmlns:a="url3" xmlns:i="url4">
                <a:AccessToken i:nil="true"/>
                <a:CarrierID i:nil="true"/>
                <a:Channel i:nil="true"/>
                <a:ClaimRefNumber i:nil="true"/>
                <a:CustomerIdentifier>1234567899</a:CustomerIdentifier>
                <a:IdentifierType>MOBILE_NUMBER</a:IdentifierType>
            </CustomerFunctionRequest>
        </GetCustomerFunctions>
    </s:Body>
</s:Envelope>

我想用不同的手机号码更改客户标识符号码。我很困惑,因为有这么多的命名空间。我尝试了以下代码,但我知道我遇到了一个问题,不了解命名空间是如何发挥作用的。

XDocument doc = XDocument.Load("RequestBody.xml");
XNamespace s = "url1";
XNamespace a = "url3";
XNamespace ns = "url2";
var customerDetails = doc.Element(s + "Envelope").Element(s + "Body").Element(ns + "GetCustomerFunctions").Elements(a + "CustomerFunctionRequest").Single();
customerDetails.Element("CustomerIdentifier").Value = customerIdentifier;
customerDetails.Element("IdentifierType").Value = identifierType;
doc.Save("RequestBody.xml");

标签: xmllinq

解决方案


这是如何做到的。

只有一个命名空间会影响相关的 XML 元素。

C#

void Main()
{
    const string fileName = @"e:\temp\RequestBody.xml";
    const string newFileName = @"e:\temp\NewRequestBody.xml";
    const string CustomerIdentifier = "CustomerIdentifier";
    
    XDocument xdoc = XDocument.Load(fileName);
    
    XNamespace ns1 = "url3";
    XElement xElem = xdoc.Descendants(ns1 + CustomerIdentifier).FirstOrDefault();
    xElem.SetValue("305803770");
    
    xdoc.Save(newFileName);
}

推荐阅读