C#xml文件创建添加子节点和父节点的相同属性

时间:2017-03-29 18:51:05

标签: c# xml

我正在使用c#创建一个xml文件,但是我遇到了一些问题。 我希望父节点和子节点具有相同的属性。但是只有其中一个节点具有该属性,即使我附加了这两个节点。

我的期望:

<request>
    <transaction transactionId:"123">
        <transactionDetail transactionId:"123"></transactionDetail>
    </transaction>
</request>

我得到了什么:

<request>
    <transaction>
        <transactionDetail transactionId:"123"></transactionDetail>
    </transaction>
</request>

<request>
    <transaction  transactionId:"123">
        <transactionDetail></transactionDetail>
    </transaction>
</request>

这取决于我编写代码的顺序(我稍后追加的节点具有属性)。你能帮我找一下导致这个问题的原因吗?

另外,我只是想知道:

附加顺序(.AppendChild()&amp; .Append())是否重要?

我不能重用已经附加在其他节点中的属性吗?

以下是创建xml文件的功能:

public ActionResult createXMLFile() {

            XmlDocument xmlFile = new XmlDocument();

            XmlNode request = xmlFile.CreateElement("request");
            XmlNode transaction= xmlFile.CreateElement("transaction");
            XmlNode transactionDetail= xmlFile.CreateElement("transactionDetail");


            XmlAttribute transactionId= xmlFile.CreateAttribute("transactionId");
            transactionId.Value = "123";

            transaction.Attributes.Append(transactionId);
            transactionDetail.Attributes.Append(transactionId);

            xmlFile.AppendChild(request);
            request.AppendChild(transaction);
            transaction.AppendChild(transactionDetail);

            string path ="somepath";

            xmlFile.Save(path);

    }

感谢您阅读我的问题。 :)

1 个答案:

答案 0 :(得分:1)

正如评论中暗示的那样,您需要创建两个属性,不能重复使用相同的属性:

var transactionId1 = xmlFile.CreateAttribute("transactionId");
transactionId1.Value = "123";
transaction.Attributes.Append(transactionId1);

var transactionId2 = xmlFile.CreateAttribute("transactionId");
transactionId2.Value = "123";
transactionDetail.Attributes.Append(transactionId2);

但是,我建议使用LINQ to XML。您可以更具声明性地创建此XML:

var doc = new XDocument(
    new XElement("request",
        new XElement("transaction", 
            new XAttribute("transactionId", "123"),
                new XElement("transactionDetail", new XAttribute("transactionId", "123"))
            )
        )
    );

doc.Save(path);

请参阅this fiddle