从头开始构建xml并以字符串形式获得结果

本文关键字:结果 字符串 构建 xml 从头开始 | 更新日期: 2023-09-27 17:54:41

我正在尝试使用linq-to-xml从头开始构建xml文档。

XElement root = new XElement("RootNode");
            XDocument doc = new XDocument(
            new XDeclaration("1.0", "utf-8", ""), root
            );
            for (int j = 0; j < 10; j++)
            {
                XElement element = new XElement("SetGrid");
                element.SetElementValue("ID", j);                    
                root.Add(element);
            }
   var reader = doc.CreateReader();//doc has 10 elements inside root element
   string result = reader.ReadInnerXml();//always empty string

如何从XDocument获取字符串

从头开始构建xml并以字符串形式获得结果

使用string result = doc.ToString()

var wr = new StringWriter();
doc.Save(wr);
string result = wr.ToString();

根据文档为空字符串提供一个选项。

XmlReader return:

当前节点中的所有XML内容,包括标记。如果当前节点没有子节点,则返回空字符串。如果当前节点既不是元素也不是属性,空字符串是返回。

试题:

XmlReader reader = doc.CreateReader();
reader.Read(); 
string result = reader.ReadInnerXml()

var wr = new StringWriter();
doc.Save(wr);
var xmlString = wr.GetStringBuilder().ToString());

完整答案在这里

长话短说,你错过了reader.MoveToContent();

。应该是:

var reader = root.CreateReader();
reader.MoveToContent(); // <- the missing line
string result = reader.ReadInnerXml();

这样result就不会是空的,你甚至不需要创建XDocument

那么原始问题的完整代码+修复是:

XElement root = new XElement("RootNode");
for (int j = 0; j < 10; j++)
{
    XElement element = new XElement("SetGrid");
    element.SetElementValue("ID", j);
    root.Add(element);
}
var reader = root.CreateReader();// root has 10 elements
reader.MoveToContent(); // <-- missing line
string result = reader.ReadOuterXml(); // now it returns non-empty string
输出:

<RootNode><SetGrid><ID>0</ID></SetGrid><SetGrid><ID>1</ID></SetGrid><SetGrid><ID>2</ID></SetGrid><SetGrid><ID>3</ID></SetGrid><SetGrid><ID>4</ID></SetGrid><SetGrid><ID>5</ID></SetGrid><SetGrid><ID>6</ID></SetGrid><SetGrid><ID>7</ID></SetGrid><SetGrid><ID>8</ID></SetGrid><SetGrid><ID>9</ID></SetGrid></RootNode>

注意:代码是在Visual Studio 2013/.NET Framework 4.5中测试的

MDSN参考:XmlReader。ReadOuterXml