繁体   English   中英

c#xml xpath创建属性(如果不在文档中)

[英]c# xml xpath create attribute if not in document

如果属性不存在,如何创建?

/Document/Setup/Info/Att/Group[@name='Manu']/osis:Attr[@name='time']/@value

我的一些文档具有value属性,但大多数却没有。

XML(有时间,没有值属性):

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="http://www.ns.com/ns/ns">
  <Setup>
    <Info>
      <FilePath>\\computer1\project\E2002307\E2002307.drg</FilePath>
      <Att>
        <Group class="custom" name="Manu" desc="attributes"
            ord="6">
          <Attr num="119" name="xyz" desc="zyx" type="s" ord="1" value="S355">
            <Valid perm="e" max="100"/>
          </Attr>
          <Attr num="120" name="thick" desc="thick." type="r" ord="2" value="5">
            <Valid perm="e" min="0" max="99999"/>
          </Attr>
          <Attr num="121" name="units" desc="units." type="s" ord="4" value="mm">
            <Valid perm="e" expr="mm" max="80"/>
          </Attr>
          <Attr num="123" name="time" desc="minutes." type="r" ord="24">
            <Valid perm="e" min="0"/>
          </Attr>
          <Attr num="124" name="X" desc="X direction." type="r" ord="11" value="3">
            <Valid perm="e" min="0"/>
          </Attr>
          <Attr num="125" name="Y" desc="Y direction." type="r" ord="12" value="1">
            <Valid perm="e" min="0"/>
          </Attr>
        </Group>

您可以使用LINQ to XML来做到这一点:

var doc = XDocument.Parse(xml);

var timeAttrs = from grp in doc.Descendants("Group")
                where (string)grp.Attribute("name") == "Manu"
                from attr in grp.Elements("Attr")
                where (string)attr.Attribute("name") == "time" &&
                    attr.Attribute("value") == null
                select attr;

foreach(var attr in timeAttrs)
{
    attr.Add(new XAttribute("value", 1));
}

稍微修改XPath使其返回不具有value属性的<Attr>元素,而不是返回属性本身:

/Document/Setup/Info/Att/Group[@name='Manu']/osis:Attr[@name='time' and not(@value)]

然后只需遍历XPath结果并根据需要添加属性:

XmlDocument doc;
.....
var query = "/Document/Setup/Info/Att/Group[@name='Manu']/osis:Attr[@name='time' and not(@value)]";
var nodes = doc.SelectNodes(query, xmlns);
foreach(XmlNode node in nodes)
{
    XmlAttribute attr = doc.CreateAttribute("value");
    attr.Value = "foo";        
    node.Attributes.Append(attr);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM