如何屏蔽或替换XML中的值?

时间:2018-08-23 11:26:18

标签: c# xml linq

我有这个 XML

<?xml version="1.0" encoding="UTF-8"?>
<TXLife xmlns="http://ACORD.org/Standards/Life/2" Version="2.22.00">

<TXLifeRequest>
	<OLifE Version="2.22.0">
		<Party id="BEB7-BDDC43FE3F01_10004">
			<PartyTypeCode tc="1">PT_PERSON</PartyTypeCode>
				<FullName>Gump,Forrest</FullName>
				<ResidenceState tc="58">USA_WI</ResidenceState>
				<Person id="D7329BB530E8_10304">
					<FirstName>Forrest</FirstName>
					<LastName>Gump</LastName>
				</Person>
		</Party>
	</OLifE>
</TXLifeRequest>
</TXLife>

我想要将FirstName的值替换为No Name

这与数据屏蔽有关。

我正在尝试使用下面的给定代码访问该节点,但是它不起作用。

var testXML = XDocument.Load("C:\\DataMask\\P0500015703691806181259345440127.xml");
            var nodePTCode = testXML.Descendants("Party").FirstOrDefault(cd => cd.Element("PartyTypeCode").Value == "PT_PERSON");

1 个答案:

答案 0 :(得分:1)

寻址元素时必须包含命名空间
另外,对于XDocument,您还必须从其 Root 属性开始。

XDocument xdoc = XDocument.Load("C:\\DataMask\\P0500015703691806181259345440127.xml");
XNamespace ns = "http://ACORD.org/Standards/Life/2";
XElement firstName = xdoc.Root.Descendants(ns + "FirstName").FirstOrDefault();
if (firstName != null) { firstName.Value = "No Name"; }

该xml将应用更新:

<TXLife xmlns="http://ACORD.org/Standards/Life/2" Version="2.22.00">
    <TXLifeRequest>
        <OLifE Version="2.22.0">
            <Party id="BEB7-BDDC43FE3F01_10004">
                <PartyTypeCode tc="1">PT_PERSON</PartyTypeCode>
                <FullName>Gump,Forrest</FullName>
                <ResidenceState tc="58">USA_WI</ResidenceState>
                <Person id="D7329BB530E8_10304">
                    <FirstName>No Name</FirstName>
                    <LastName>Gump</LastName>
                </Person>
            </Party>
        </OLifE>
    </TXLifeRequest>
</TXLife>

修改

如果适用,您还必须更新FullName xml元素以反映FirstName中的更改。

XElement lastName = xdoc.Root.Descendants(ns + "LastName").FirstOrDefault();
XElement fullName = xdoc.Root.Descendants(ns + "FullName").FirstOrDefault();
fullName.Value = String.Format("{0},{1}", (String)lastName, (String)firstName);