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

问题描述 投票:3回答:4

我是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>
c# xml xmldocument
4个回答
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);

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
投票

问题出在你的声明中......

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);

此代码将有助于实现预期的输出。


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();
© www.soinside.com 2019 - 2024. All rights reserved.