【问题标题】:problem adding attribute using XDocument使用 XDocument 添加属性的问题
【发布时间】:2011-07-13 00:44:19
【问题描述】:

请注意最后一条评论:OP 刚刚忘记打电话给Save()


我正在检查 ProductDetails 节点下属性 ProductCount 的 XML,如果该属性不存在,则在此节点下添加具有默认值的属性。

我可以检查属性是否存在但我无法添加它,虽然它没有给我任何错误但甚至没有添加属性。

这是我的代码:

 XDocument XMLDoc = XDocument.Load(fileName);

 foreach (var detail in XMLDoc.Descendants(_ns + "ProductDetails"))
 {
    if (detail.Attribute("ProductCount") == null)
    {
        detail.SetAttributeValue("ProductCount", "1");
    }
 }

_ns 有我的命名空间。

我无法弄清楚我做错了什么,如果它不存在,为什么不添加 ProductCount 属性。

【问题讨论】:

  • 我怀疑“foreach”不匹配任何元素。你能张贴源文件的片段吗?那么,_ns变量是如何定义的呢?
  • 您的基本代码没问题,您如何确定“它不起作用”?你用过调试器吗?
  • foreach 很好我测试了它我搜索了 XML 中的属性并且没问题,如果属性不存在它给出 null,我什至检查了控件是否在 if 语句中但它没有添加属性。
  • "productDetails" 以小写开头?在代码中,您使用了上面的“P”。总是在 sn-p 中添加一个命名空间:xml 片段在哪里?你确定枚举会产生一些结果吗?

标签: c# xml linq-to-xml


【解决方案1】:

尝试将值作为整数而不是像这样的字符串传递:

detail.SetAttributeValue("ProductCount", 1);

编辑:写了不好的建议......但我试图测试你的问题......

创建了一个包含内容的.xml 文件:

<root>
  <ProductDetails hadSuspension="false" isComplimentary="false" hasFamily1="false" hasFamily2="false" isInsured="false" hasJoint="false" ProductCount="1"/>
  <ProductDetails hadSuspension="false" isComplimentary="false" hasFamily1="false" hasFamily2="false" isInsured="false" hasJoint="false"/>
</root>

测试代码:

XDocument XMLDoc = XDocument.Load("C:\\a.xml");

foreach (var detail in XMLDoc.Descendants("ProductDetails"))
{
   //Dont need to check, because SetAttributeValue creates if not exists
   //if(detail.Attribute("ProductCount") == null)
   detail.SetAttributeValue("ProductCount", 2);
}
XMLDoc.Save("C:\\b.xml");

和结果b.xml文件内容:

<root>
  <ProductDetails hadSuspension="false" isComplimentary="false" hasFamily1="false" hasFamily2="false" isInsured="false" hasJoint="false" ProductCount="2" />
  <ProductDetails hadSuspension="false" isComplimentary="false" hasFamily1="false" hasFamily2="false" isInsured="false" hasJoint="false" ProductCount="2" />
</root>

所以一切都对我有用。

【讨论】:

    【解决方案2】:

    试试这个:

    if (detail.Attribute("ProductCount") == null)
    {
        detail.Add(new XAttribute("ProductCount", "1"));
    }
    

    【讨论】:

    • 我试过但没有运气:-( 尝试了下面的两个选项 detail.Add(new XAttribute("ProductCount", "1")); detail.Add(new XAttribute(_ns + "ProductCount" , "1"));
    • @rs 如果是命名空间,那么您还必须在 if() 语句中使用 _ns +
    • 感谢大家的回复,我发现我错过了保存文档。
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多