在c#中创建嵌套的xml文档

时间:2014-01-07 08:24:30

标签: c# xml xmldocument

我是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>

4 个答案:

答案 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();