【问题标题】:Creating XML document with Two root nodes创建具有两个根节点的 XML 文档
【发布时间】:2015-06-19 11:14:16
【问题描述】:

我想用两个根节点创建 XML,像这样

<?xml version="1.0" encoding="IBM437"?>
<header1>
<header2>
  <fracc>6004</fracc>
  <txncode>HTH</txncode>
  <reason>testing</reason>
  <timeout>20</timeout>
  <rdate>2/3/2015 12:00:00 AM</rdate>
  <rtime>6/18/2015 1:20:00 PM</rtime>
  <seqno>5</seqno>
  <prefix>8</prefix>
  <msgtype>trr</msgtype>
  <sendto>trr</sendto>
  <replyto>trr</replyto>
</header2>
</header1>

我的代码是这样的,我的代码无法添加两个根元素,必须使用XmlDocument类。

XmlDocument xmlDoc = new XmlDocument();
XmlNode rootNode = xmlDoc.CreateElement("header" );
xmlDoc.AppendChild(rootNode);

XmlNode accountNode = xmlDoc.CreateElement("fracc");
accountNode.InnerText = Infracc;
rootNode.AppendChild(accountNode);

XmlNode txnNode = xmlDoc.CreateElement("txncode");
txnNode.InnerText = Intxncode;
rootNode.AppendChild(txnNode);

XmlNode reasonNode = xmlDoc.CreateElement("reason");
reasonNode.InnerText = Inreason;
rootNode.AppendChild(reasonNode);

XmlNode timeoutNode = xmlDoc.CreateElement("timeout");
timeoutNode.InnerText = Intimeout.ToString();
rootNode.AppendChild(timeoutNode);

XmlNode rdateNode = xmlDoc.CreateElement("rdate");
rdateNode.InnerText = Indate.ToString();
rootNode.AppendChild(rdateNode);

XmlNode rtimeNode = xmlDoc.CreateElement("rtime");
rtimeNode.InnerText = Intime.ToString();
rootNode.AppendChild(rtimeNode);

XmlNode seqnoNode = xmlDoc.CreateElement("seqno");
seqnoNode.InnerText = Inseqno.ToString();
rootNode.AppendChild(seqnoNode);

XmlNode prefixNode = xmlDoc.CreateElement("prefix");
prefixNode.InnerText = Inprefix.ToString();
rootNode.AppendChild(prefixNode);

XmlNode msgtypeNode = xmlDoc.CreateElement("msgtype");
msgtypeNode.InnerText = Inmsgtype;
rootNode.AppendChild(msgtypeNode);

XmlNode sendtoNode = xmlDoc.CreateElement("sendto");
sendtoNode.InnerText = Insendto;
rootNode.AppendChild(sendtoNode);

XmlNode replytoNode = xmlDoc.CreateElement("replyto");
replytoNode.InnerText = Inreplyto;
rootNode.AppendChild(replytoNode);

xmlDoc.Save("boc.xml");
xmlDoc.Load("boc.xml");
xmlDoc.Save(Console.Out);           

return xmlDoc;

我的输出是这样的

<?xml version="1.0" encoding="IBM437"?>
<header>
  <fracc>6004</fracc>
  <txncode>ttt</txncode>
  <reason>testing</reason>
  <timeout>20</timeout>
  <rdate>2/3/2015 12:00:00 AM</rdate>
  <rtime>6/18/2015 1:20:00 PM</rtime>
  <seqno>5</seqno>
  <prefix>8</prefix>
  <msgtype>tt</msgtype>
  <sendto>t</sendto>
  <replyto>t</replyto>
</header>

请帮我添加两个根节点。

【问题讨论】:

  • 你在xml中有两个root的原因是什么?这有点违反 xml 标准,这样的 xml 格式不正确,并且大多数 xml 解析器(甚至任何解析器)都无法解析它。
  • 顺便说一句 - 您发布的 xml 实际上并没有两个根。相反,它打开了&lt;header1&gt;,然后是&lt;header2&gt;,在关闭&lt;/header2&gt; 之后,您将关闭&lt;/header&gt; - 它从未打开过。那么你到底想达到什么目的呢?
  • 我实际上无法从您的代码中看到您是如何尝试添加第二个标题的。或者你的意思是当你尝试添加第二个时你得到一个错误。你的意思是你想添加一个根注释,然后是一个将有子节点的父节点?您可以这样做,但在不了解上下文的情况下可能很难为您提供帮助。
  • @AndyKorneyev snap ;)
  • 是的,我正在添加第二个根元素,例如 XmlNode rootNode2 = xmlDoc.CreateElement("header2" ); xmlDoc.AppendChild(rootNode);

标签: c# xml xmldocument xml-documentation


【解决方案1】:

您没有添加 2 个根元素。

更改代码行

          XmlDocument xmlDoc = new XmlDocument();
          XmlNode rootNode = xmlDoc.CreateElement("header" );
          xmlDoc.AppendChild(rootNode);

如下图-

            XmlDocument xmlDoc = new XmlDocument();
            XmlNode rootNode1 = xmlDoc.CreateElement("header1");
            xmlDoc.AppendChild(rootNode1);
            XmlNode rootNode = xmlDoc.CreateElement("header2");
            rootNode1.AppendChild(rootNode);

【讨论】:

    【解决方案2】:

    根据您的示例输出,很明显&lt;header1&gt; 是根元素,&lt;header2&gt; 在内部 &lt;header1&gt;,所以您只需将&lt;header2&gt; 附加在@987654326 内部@ 并将其余元素附加到 &lt;header2&gt; 中。这段代码应该可以工作

    XmlDocument xmlDoc = new XmlDocument();
    XmlNode rootNode = xmlDoc.CreateElement("header1");
    xmlDoc.AppendChild(rootNode);
    
    XmlNode rootNode2 = xmlDoc.CreateElement("header2");
    rootNode.AppendChild(rootNode2);
    
    XmlNode accountNode = xmlDoc.CreateElement("fracc");
    accountNode.InnerText = Infracc;
    rootNode2.AppendChild(accountNode);
    
    XmlNode txnNode = xmlDoc.CreateElement("txncode");
    txnNode.InnerText = Intxncode;
    rootNode2.AppendChild(txnNode);
    
    XmlNode reasonNode = xmlDoc.CreateElement("reason");
    reasonNode.InnerText = Inreason;
    rootNode2.AppendChild(reasonNode);
    
    XmlNode timeoutNode = xmlDoc.CreateElement("timeout");
    timeoutNode.InnerText = Intimeout.ToString();
    rootNode2.AppendChild(timeoutNode);
    
    XmlNode rdateNode = xmlDoc.CreateElement("rdate");
    rdateNode.InnerText = Indate.ToString();
    rootNode2.AppendChild(rdateNode);
    
    XmlNode rtimeNode = xmlDoc.CreateElement("rtime");
    rtimeNode.InnerText = Intime.ToString();
    rootNode2.AppendChild(rtimeNode);
    
    XmlNode seqnoNode = xmlDoc.CreateElement("seqno");
    seqnoNode.InnerText = Inseqno.ToString();
    rootNode2.AppendChild(seqnoNode);
    
    XmlNode prefixNode = xmlDoc.CreateElement("prefix");
    prefixNode.InnerText = Inprefix.ToString();
    rootNode2.AppendChild(prefixNode);
    
    XmlNode msgtypeNode = xmlDoc.CreateElement("msgtype");
    msgtypeNode.InnerText = Inmsgtype;
    rootNode2.AppendChild(msgtypeNode);
    
    XmlNode sendtoNode = xmlDoc.CreateElement("sendto");
    sendtoNode.InnerText = Insendto;
    rootNode2.AppendChild(sendtoNode);
    
    XmlNode replytoNode = xmlDoc.CreateElement("replyto");
    replytoNode.InnerText = Inreplyto;
    rootNode2.AppendChild(replytoNode);
    
    xmlDoc.Save("boc.xml");
    xmlDoc.Load("boc.xml");
    xmlDoc.Save(Console.Out);           
    
    return xmlDoc;
    

    工作小提琴:https://dotnetfiddle.net/EevsJq

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      相关资源
      最近更新 更多