如何在c#中的xml之后添加数据并在之后读取xml?

如何在c#中的xml之后添加数据并在之后读取xml?,c#,xml,C#,Xml,我必须创建一个带有xml头的文件,然后我必须放入普通数据,如下所示: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Header> <Algorithm>alg</Algorithm> <nod2>aaa</nod2> <nod3>bbb</nod3> <node> <User&g

我必须创建一个带有xml头的文件,然后我必须放入普通数据,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Header>
  <Algorithm>alg</Algorithm>
  <nod2>aaa</nod2>
  <nod3>bbb</nod3>      
  <node>
    <User>
     <Email />
     <SessionKey />
     </User>
  </node>
</Header>
Data of the file....
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Header>
  ...
</Header>
<!-- your data -->
<!-- another data -->
它很好用,但是当我想和你一起读的时候

private void readHeader(FileStream input, out string algorithm)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(input);
}
我得到一个错误,当“文件的数据…”开始时:“根级别的数据无效”。
有没有一种方法可以在整个xml之后处理数据,或者让我将数据添加为一个节点?

我通过直接写入文件doc.Save(@“c:\temp\test1.xml”)测试了您的代码; 从该文件加载可以很好地工作。因此,您的xml文档没有问题。检查您的文件流。你把它冲洗干净并关好了吗?它有UTF-8编码吗?
节点字符串中的输入是什么。根据xml规则,没有无效的内容?

这可以通过多种方式完成。在评论中,您已经指出,由于讨论范围之外的原因,最好的方法是不可接受的。为了完整起见,我将把它放在第一位。跳到tl;dr我想你最后会做什么

执行此操作的首选方法是将加密数据放入CDATA块:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<File>
    <Header>
      <Algorithm>alg</Algorithm>
      <nod2>aaa</nod2>
      <nod3>bbb</nod3>      
      <node>
        <User>
         <Email />
         <SessionKey />
         </User>
      </node>
    </Header>
    <Data><![CDATA[
    ICAgIFhtbE5vZGUgYWxnb3JpdGhtID0gZG9jLkNyZWF0ZUVsZW1lbnQoIkFsZ29yaXRobSIpOw0K
    ICAgIGFsZ29yaXRobS5Jbm5lclRleHQgPSAiYWxnIjsNCiAgICBoZWFkZXIuQXBwZW5kQ2hpbGQo
    YWxnb3JpdGhtKTsNCiAgICBYbWxOb2RlIG5vZGUyPSBkb2MuQ3JlYXRlRWxlbWVudCgibm9kMiIp
    Ow0KICAgIG5vZGUyLklubmVyVGV4dCA9IG5vZDI7DQogICAgaGVhZGVyLkFwcGVuZENoaWxkKG5v
    ZGUyKTsNCiAgICBYbWxOb2RlIG5vZGUzPSBkb2MuQ3JlYXRlRWxlbWVudCgibm9kMyIpOw0KICAg
    IG5vZGUzLklubmVyVGV4dCA9IG5vZDM7DQogICAgaGVhZGVyLkFwcGVuZENoaWxkKG5vZGUzKTs=
    ]]></Data>
</File>

(事实上,MIME可能是第一选择,上面的可能是第二选择)。但我觉得他们也不会喜欢哑剧

第三种选择是,将文件作为字符串读取,并搜索插入XML和二进制数据之间的某个标记

tl;博士 如果他们不允许您将这样的标记添加到文件中(我打赌他们不会),请搜索子字符串的第一个匹配项

var xml=File.ReadAllText(filePath);
var endTag=“”;
var headerXML=xml.Substring(0,xml.IndexOf(endTag)+endTag.Length);
var xdHeader=新的XmlDocument();
xdHeader.LoadXml(headerXML);

在单个根节点之后,只能将注释和处理器指令写入xml。因此,您可以尝试在注释中写入数据

它将如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Header>
  <Algorithm>alg</Algorithm>
  <nod2>aaa</nod2>
  <nod3>bbb</nod3>      
  <node>
    <User>
     <Email />
     <SessionKey />
     </User>
  </node>
</Header>
Data of the file....
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Header>
  ...
</Header>
<!-- your data -->
<!-- another data -->

...
此方法有:您的数据不能包含
--
(双连字符),也不能以
-
结尾


当然,最好不要这样做。

“它工作得很好”——你怎么知道?它甚至不编译。请出示您的实际代码。如果您问题顶部的示例“XML”是您真正生成的,那么它不是有效的XML。我将它用于加密和解密文件的程序。xml部分应该描述加密设置,在原始文件的加密数据出现之后,它不在任何节点内。所以,当我生成文件并用记事本打开它时,它看起来就像我被要求做的一样,就像顶部的xml一样。节点外部的数据是否无效?如果是,是否有一种简单的方法可以读取有效的xml头并忽略不在节点中的数据?“它不在任何节点中”--如果是,则无法使用xml解析器解析文件。你有两个选择:1。分别解析报头;2:将数据放在XML本身的CDATA块中:
。我认为您应该对加密数据进行Base64编码。是的,在CDATA块中。到目前为止,这是首选的方法。我也更喜欢将其放在节点中,但有人要求我以其他方式进行操作:/谢谢帮助:)我将其用于加密和解密文件的程序。xml部分应该描述加密设置,在原始文件的加密数据出现之后,它不在任何节点内。所以,当我生成文件并用记事本打开它时,它看起来就像我被要求做的一样,就像顶部的xml一样。节点外部的数据是否无效?如果是,是否有一种简单的方法可以只读取有效xml的头并忽略不在节点中的数据?