如何从 StringBuilder C# 创建具有多个根的 XML 文件

问题描述 投票:0回答:1

我是一名机械师,必须开发管理 xml 文件的工具。

我有一个问题,需要你的帮助。

我必须管理的一个 xml 文件有多个根。不要问为什么,我的提供商不会改变...

下面,我已经在 StringBuilder 中加载了文件,我想将其保存在 file.xml 中

<MLlibXMLCommand message_level='warning' command='merge'>
  <Inputs>
    <File iref='0000ancv' name='source\APS4322_TileCalibrations.bml'/>
  </Inputs>
  <Outputs>
    <File name='target\merged.bml' type='bml' />
  </Outputs>
</MLlibXMLCommand>

<MLlibXMLCommand message_level='warning' command='convert' output_model='special_transformation'>
  <Inputs>
    <File name='target\merged.bml' type='bml'/>
  </Inputs>
  <Outputs>
    <File name='target\XPlanar_TileCalibrations.bml' type='bml'/>
  </Outputs>
</MLlibXMLCommand>

我无法使用 XmlDocument.Load(myStringBuilder) 将其保存在新文件中(因为有多个根)。

我尝试使用片段异常设置的 XmlWriter,但没有成功使用正确的格式 write.MyStringBuilder() 。 不遵守换行符,并且在我的字符串中添加了一些内容。该文件没有用。 我得到的就在下面:

&lt;MLlibXMLCommand message_level="warning" command="merge"&gt;&lt;Inputs&gt;&lt;File iref="0000ancv" name="source\APS4322_TileCalibrations.bml" / /&gt;&lt;File iref="0000and1" name="source\APS4322_TileCalibrations.bml" /&gt;&lt;File iref="0000anct" name="source\APS4322_TileCalibrations.bml" /&gt;&lt;File iref="0000and1" name="source\APS4322_TileCalibrations.bml" /&gt;&lt;/Inputs&gt;&lt;Outputs&gt;&lt;File name="target\merged.bml" type="bml" /&gt;&lt;/Outputs&gt;&lt;/MLlibXMLCommand&gt;&lt;MLlibXMLCommand message_level="warning" command="convert" output_model="special_transformation"&gt;&lt;Inputs&gt;&lt;File name="target\merged.bml" type="bml" /&gt;&lt;/Inputs&gt;&lt;Outputs&gt;&lt;File name="target\XPlanar_TileCalibrations.bml" type="bml" /&gt;&lt;/Outputs&gt;&lt;/MLlibXMLCommand&gt;

第二个解决方案是使用 .WriteAllText 但不考虑断行。 我得到的文件不正确:

<MLlibXMLCommand message_level="warning" command="merge"><Inputs><File iref="0000ancv" name="source\APS4322_TileCalibrations.bml" /><File/></Inputs><Outputs><File name="target\merged.bml" type="bml" /></Outputs></MLlibXMLCommand><MLlibXMLCommand message_level="warning" command="convert" output_model="special_transformation"><Inputs><File name="target\merged.bml" type="bml" /></Inputs><Outputs><File name="target\XPlanar_TileCalibrations.bml" type="bml" /></Outputs></MLlibXMLCommand>

我不知道是否我没有使用正确的工具,或者我是否缺少一个工具,或者我的制作方法是否不好。

提前谢谢您,如果您可以在我的程序过程中解锁这一步(该步骤包括将 myStringBuilder 保存在 test.xml 等文件中)。

我尝试过,但没有任何效果正常:

StringBuilder sb = new 
StringBuilder(FormatTileCalibrationXml.InnerXml);
StringBuilder sb1 = new 
StringBuilder(FormatTileCalibrationXml.OuterXml);
sb.Remove(0, 6); //remove first root
int length = sb.Length - 7;
sb.Remove(length, 7); // remove last root

//Solution 1 to create the xml file with the stringbuilder as source
            XmlWriterSettings settingsw = new XmlWriterSettings();
            settingsw.OmitXmlDeclaration = true;
            settingsw.ConformanceLevel = ConformanceLevel.Fragment;
            
            using (XmlWriter writer = XmlWriter.Create("Test4.xml", settingsw))
            {
                writer.WriteString(sb.ToString());
            }
//Solution 2
            File.WriteAllText("Test3.xml", sb.ToString());

//Solution 3
            string path = @"C:\temp\Test5.xml";

            using (System.IO.StreamWriter file = new System.IO.StreamWriter(path))
            {
                file.Write(sb1);
            }
            
//Solution 4
            FormatTileCalibrationXml.LoadXml(sb.ToString());
            FormatTileCalibrationXml.Save("Test6.xml");

c# xml file stringbuilder xmldocument
1个回答
1
投票

首先,如果您已经在

StringBuilder
中有内容,为什么不将其保存到文件中呢?

System.IO.File.WriteAllText("output.xml", sb.ToString());

如果您需要使用 XML 节点,那么最好切换到 linq-to-XML(

System.Xml.Linq
命名空间),因为像旧的
XmlDocument
那样使用 XML 片段会更困难。

您可以加载 XML 片段文件(作为节点上的列表,因为

XDocument
需要单根):

static List<XNode> LoadNodes(string fileName)
{
    using var reader = XmlReader.Create(fileName,
        new XmlReaderSettings
        {
            ConformanceLevel = ConformanceLevel.Fragment,
        });
    var nodes = new List<XNode>();
    while(reader.Read() && reader.NodeType != XmlNodeType.None)
    {
        nodes.Add(XNode.ReadFrom(reader));
    }
    return nodes;
}

并保存它们:

static void SaveNodes(IEnumerable<XNode> nodes, string fileName)
{
    using var writer = XmlWriter.Create(fileName,
        new XmlWriterSettings
        {
            ConformanceLevel = ConformanceLevel.Fragment,
            Indent = true,
        });
    foreach(var node in nodes)
    {
        node.WriteTo(writer);
    }
}

您甚至可以采用

XDocument
并忽略其根元素,生成多根文件:

var doc = new XDocument(
    new XElement("Root",
        new XElement("Child1"),
        new XElement("Child2")));
SaveNodes(doc.Root.Nodes(), "output.xml");
© www.soinside.com 2019 - 2024. All rights reserved.