我是XmlDocument
中的新手。我想在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>
答案 0 :(得分:7)
使用较新的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);
答案 1 :(得分:4)
您将所有孩子都附加到根元素。您可能需要以下内容:
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"));
...
答案 2 :(得分:2)
问题出现在以下陈述中....
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);
此代码有助于实现预期的输出。
答案 3 :(得分:1)
如果要使用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();