如何使用C#在xml中添加带标记的属性

时间:2015-07-01 07:37:36

标签: c# xml

我正在从C#更新我的xml语法文件。我在节点内成功插入了子节点。我想插入带有属性的子节点。我已经这样做但格式错误。我想添加名为as的新节点及其属性名称ad,其值为out = "Karaa chee";。****

<?xml version="1.0" encoding="utf-8"?>
             <grammar xml:lang="en-US" root="top" mode="voice" tag-format="semantics/1.0"
             sapi:alphabet="x-microsoft-ups" 
       version="1.0" xmlns="http://www.w3.org/2001/06/grammar"
      xmlns:sapi="http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions">

       <rule id="top" scope="public">
       <item>
        <ruleref uri="#CityName"/>
        <tag> out = "src=" + rules.latest(); </tag>
       </item>
       to
       <item>
        <ruleref uri="#CityName"/>
        <tag> out += "^dst=" + rules.latest(); </tag>
      </item>
       </rule>

      <rule id="CityName" scope="private">
      <one-of>

       <item>
       Abbottabad
        <tag>out = "Abbott aabaad";</tag>
        </item>

       <item>
        Karachi
        <tag>out = "Karaa chee";</tag>
       </item>

         <item>
        New Item here
        <tag>out = "new item pronunciation here";</tag>
         </item>   

      </one-of>
     </rule>

    </grammar>

这里是我用来添加节点及其属性的C#代码

XmlElement eleItem = xmlDoc.CreateElement("item", ns);
 eleItem.InnerText = item;
   eleItem.SetAttribute("tag", val);
    foundNode.AppendChild(eleItem);

3 个答案:

答案 0 :(得分:1)

就像Panagiotis已经评论过的那样:

您想要的输出无效

<item>
    New York
    <tag>out = "Neww Yarke";</tag>
</item>

您想要的输出应如下所示:

<item>
    New York
    <tag out="Neww Yarke"/>
</item>

您可以使用linq to XML

执行以下操作
var document = new XDocument();
var itemelement = new XElement("item", 
    "New York",
    new Xelement("tag", new XAttribute("out", "Neww Yarke")));

答案 1 :(得分:1)

问题中给出的XML表明item元素可以包含文本和其他标记元素。请注意,示例XML中显示的标记不是您的代码尝试创建的属性,它将按以下方式编写:

<item tag="out = &quot;Abbott aabaad&quot;;">Abbottabad</item>

您正在创建的是子元素。与元素混合的还有文本块。要创建混合文本和元素内容,您需要使用文本节点和元素节点,如下所示:

public static void Main()
{
    XmlDocument doc = new XmlDocument();
    var root = doc.CreateElement("grammar");
    doc.AppendChild(root);

    var item = doc.CreateElement("item");

    var text = doc.CreateTextNode("Abbottabad");
    item.AppendChild(text);

    var tag = doc.CreateElement("tag");
    tag.InnerText = "out = \"Abbott aabaad\";";
    item.AppendChild(tag);

    root.AppendChild(item);

    Console.WriteLine(doc.OuterXml);
}

产生类似这样的东西:

<grammar>
    <item>
       Abbottabad
       <tag>out = "Abbott aabaad";</tag>
    </item>
</grammar>

答案 2 :(得分:1)

使用LINQ to XML,您可以这样做:

XNamespace ns = "http://www.w3.org/2001/06/grammar";
XDocument xmlDoc = XDocument.Load("xmlfile.xml");
XElement newitem = new XElement(ns +"Item", new Object[] {"New York", 
                                new XElement(ns + "tag", new Object[] {new XAttribute("out", "Neww Yarke")})});
        XElement parentNode = xmlDoc.Descendants(ns + "one-of").First();
        parentNode.Add(newitem);
        xmlDoc.Save("xmlfile.xml");

如果您在XmlDocument或XDocument之间犹豫不决:topic