我是一名机械师,必须开发管理 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() 。 不遵守换行符,并且在我的字符串中添加了一些内容。该文件没有用。 我得到的就在下面:
<MLlibXMLCommand message_level="warning" command="merge"><Inputs><File iref="0000ancv" name="source\APS4322_TileCalibrations.bml" / /><File iref="0000and1" name="source\APS4322_TileCalibrations.bml" /><File iref="0000anct" name="source\APS4322_TileCalibrations.bml" /><File iref="0000and1" 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>
第二个解决方案是使用 .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");
首先,如果您已经在
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");