XML> XDocument>元素设置值

时间:2016-08-25 16:03:19

标签: c# asp.net xml

我正在尝试设置/更改为“toPosition”的值。我有以下xml(已更改);

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <WorkList xmlns="http://bb.someplace.com/websvcs">
         <profile>
            <userName>Bob</userName>
         </profile>
         <dataFilter>
            <Location>
               <String>Downtown</String>
            </Location>
         </dataFilter>
         <attrFilter>
            <cityState>1</cityState>
         </attrFilter>
         <fromPosition>0</fromPosition>
         <toPosition>100</toPosition>
      </WorkList>
   </soapenv:Body>
</soapenv:Envelope>

我有以下代码;

XDocument xml = XDocument.Load(@"C:\\Test.xml");
XNamespace ns = xml.Root.Name.Namespace;
XElement elm = xml.Root.Element(ns + "Body");
// Works to this point

XElement elm2 = xml.Element("WorkList");
elm2.Element("toPosition").Value = "50";
//elm2 returns a null

我在这个主题的众多帖子中尝试了很多不同的代码变体,但是我没有成功地去上班。

请帮忙! TIA ..

1 个答案:

答案 0 :(得分:0)

Element只获取与指定名称匹配的第一个直接子元素。你想要一个嵌套3级深度的元素。 Descendants将以递归方式读取与名称匹配的所有子元素,因此这通常是在文档中的任何位置查找元素的最简单方法。

您需要考虑的第二件事是名称空间。 toPosition的名称空间是从其父级继承的默认名称空间。父项中的默认名称空间声明由xmlns属性声明。

所以,将这些放在一起:

XNamespace ns = "http://bb.someplace.com/websvcs";

var element = doc.Descendants(ns + "toPosition").Single();

element.Value = "50";