我正在使用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);
}
感谢您阅读我的问题。 :)
答案 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。