我是XmlDocument
.i的新手想要在c#中创建嵌套的xml文档。通过一些reaserach我想知道XmlDocument
是建议的方法来创建xml如果大小很小。
我在创建嵌套标签时遇到了一些麻烦
码:
XmlDocument doc = new XmlDocument();
XmlDeclaration xDeclare = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
XmlElement root = doc.DocumentElement;
doc.InsertBefore(xDeclare, root);
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("FIXML"));
el.AppendChild(doc.CreateElement("Header")).InnerText = "";
el.AppendChild(doc.CreateElement("RequestHeader")).InnerText = "";
el.AppendChild(doc.CreateElement("MessageKey")).InnerText = "";
el.AppendChild(doc.CreateElement("RequestUUID")).InnerText = "938692349";
Console.WriteLine(doc.OuterXml);
它的输出为
<?xml version="1.0" encoding="UTF-8"?>
<FIXML>
<Header></Header>
<RequestHeader></RequestHeader>
<MessageKey></MessageKey>
<RequestUUID>938692349</RequestUUID>
</FIXML>
但应该是这样的
<?xml version="1.0" encoding="UTF-8"?>
<FIXML>
<Header>
<RequestHeader>
<MessageKey>
<RequestUUID>938692349</RequestUUID>
</MessageKey>
</RequestHeader>
</Header>
</FIXML>
使用更新的XML API(XDocument)更容易
var doc =
new XElement("FIXML", // you can optionally add an XDocument as outer element
new XElement ("Header",
.... // more child elements, values and/or attributes
new XElement("RequestUUID", 938692349)
));
doc.Save(fileName);
您将所有子项追加到根元素。您可能需要以下内容:
XmlDocument doc = new XmlDocument();
XmlDeclaration xDeclare = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
XmlElement documentRoot = doc.DocumentElement;
doc.InsertBefore(xDeclare, documentRoot);
XmlElement rootEl = (XmlElement)doc.AppendChild(doc.CreateElement("FIXML"));
XmlElement child1 = (XmlElement)rootEl.AppendChild(doc.CreateElement("Header"));
XmlElement child2 = (XmlElement)child1.AppendChild(doc.CreateElement("RequestHeader"));
...
问题出在你的声明中......
el.AppendChild(doc.CreateElement("Header")).InnerText = "";
el.AppendChild(doc.CreateElement("RequestHeader")).InnerText = "";
el.AppendChild(doc.CreateElement("MessageKey")).InnerText = "";
el.AppendChild(doc.CreateElement("RequestUUID")).InnerText = "938692349";
你把所有东西都附加到了el。这就是为什么你得到错误的输出,根据你的输出,你应该像下面这样做...
XmlElement header = doc.CreateElement("Header")).InnerText = "";
XmlElement RequestHeader = doc.CreateElement("RequestHeader")).InnerText = "";
header.AppendChild(RequestHeader);
此代码将有助于实现预期的输出。
如果要使用XElement动态执行此操作。假设您的输入存在于某种集合或数组中。您可以尝试以下方法。
List<string> xmlList = new List<string>();
xmlList.Add("FIXML");
xmlList.Add("Header");
xmlList.Add("RequestHeader");
xmlList.Add("RequestUUID");
XElement parentNode = null;
string lastParent = null;
foreach (var item in xmlList)
{
if (parentNode == null)
{
parentNode = new XElement(item);
lastParent = XmlConvert.EncodeName(item);
}
else
{
var ln = parentNode.DescendantsAndSelf().FirstOrDefault(x => x.Name.LocalName == lastParent);
ln.Add(new XElement(XmlConvert.EncodeName(item)));
lastParent = XmlConvert.EncodeName(item);
}
}
Console.WriteLine(parentNode);
Console.ReadLine();