2

我正在使用XElement创建一个XMLDocument在分层 WPF 树视图中使用的。如果我创建一个新元素:

    x_element = new XElement("node",
    new XElement("tree_id", strData[0]),
    new XElement("sys_id", dpl.DepSysId),
    new XElement("part_id", strData[8]),
    new XElement("make", strData[6]),
    new XElement("model", strData[5]),
    new XElement("level", strData[2]));

然后我需要向“节点”添加属性,所以我尝试了:

   XElement temp_el = x_element.Element("node"); // This is returning null
   temp_el.SetAttributeValue("title", strData[7] + " " + strData[6] + " " + strData[5]);
   temp_el.SetAttributeValue("canEdit", "False");
   temp_el.SetAttributeValue("status", nStatus.ToString());
   temp_el.SetAttributeValue("qty", strData[13]);
   temp_el.SetAttributeValue("part", strData[8]);

在上面的代码中 temp_el 为空,但我可以在调试器中看到 x_element 包含以下内容:

<node>
  <tree_id>82</tree_id>
  <sys_id>82</sys_id>
  <part_id>169</part_id>
  <make>ST Panel</make>
  <model>Logical Pure 16 tube Collector</model>
  <level>0</level>
</node>

为了解决这个问题,我使用了以下内容:

   foreach (XElement temp_el in x_element.DescendantsAndSelf())
   {
       if (temp_el.Name == "node")
       {
           temp_el.SetAttributeValue("title", strData[7] + " " + strData[6] + " " + strData[5]);
           temp_el.SetAttributeValue("canEdit", "False");
           temp_el.SetAttributeValue("status", nStatus.ToString());
           temp_el.SetAttributeValue("qty", strData[13]);
           temp_el.SetAttributeValue("part", strData[8]);
           break;
       }
   }

虽然上述工作我只是好奇为什么我得到 null 返回。我的解决方法是最好的方法吗?

问候。

4

3 回答 3

3

You defined your XElement like this:

x_element = new XElement("node", /* child nodes */);

Where "node" is the name of the XElement you are creating, and the following parameters are its children.

By using x_element.Node("node"), you are trying to get the child node named "node", and there isn't such a child node.
x_element itself is the node named "node".
DescendantsAndSelf worked because it includes x_element (hence "AndSelf"), but you don't need this either because you already have the node.

So you can change your second code snippet to this:

x_element.SetAttributeValue("title", strData[7] + " " + strData[6] + " " + strData[5]);
x_element.SetAttributeValue("canEdit", "False");
// etc.

(BTW, you can also add the Attributes in the constructor)

于 2013-05-08T07:43:19.440 回答
1

因为有了你的第一个temp_el

XElement temp_el = x_element.Element("node");

您曾经获取不被视为 x_element 元素的节点。

它被视为它的根。然而,对于第二个,

x_element.DescendantsAndSelf()`

您使用了XElement将节点本身视为元素的此方法。

XContainer.Elements 方法-按文档顺序返回此元素或文档的子元素的集合。

XElement.DescendantsAndSelf 方法-返回包含此元素的元素的集合,以及此元素的所有后代元素,按文档顺序排列。

于 2013-05-08T07:50:40.350 回答
0

为了解决这个问题,我使用了 Descendants()。这是我的代码片段

public void UpdateEnquiry([FromBody]XElement UpdatePurchaseOrder)
        {
            var obj = XElement.Parse(UpdatePurchaseOrder.ToString());
            var ii = (from v in obj.Descendants() select new { v.Value }).ToList() ;
         }
于 2019-02-19T07:29:25.360 回答