解析XML文件并用文本文件中的值替换所选节点

时间:2009-08-28 02:17:23

标签: c# xml winforms parsing text

我编写了一个C#Winforms程序来获取XML文件,并将文本文件中的值加载到用户在UI上指定的该字段的每次出现。无论出于何种原因,程序在任何不包含值的节点上插入回车符。例如,它会对<example></example>执行此操作,而对<country>USA</country>

之类的内容不会出错

是什么导致它做到这一点,我该如何防止它?以下是处理此功能的部分的代码。

XmlDocument LoadXmlDoc = new XmlDocument();
StreamReader sr = File.OpenText(DataLoadTxtBx.Text);
string InputFromTxtFile;
LoadXmlDoc.Load(XmlPath.Text);

XmlNodeList NodeToCreateOrReplace = LoadXmlDoc.GetElementsByTagName(XmlTagNameTxtBx.Text);

foreach (XmlNode SelectedNode in NodeToCreateOrReplace)
{
    if ((InputFromTxtFile = sr.ReadLine()) != null)
    {
        SelectedNode.InnerText = InputFromTxtFile;
    }
}
sr.Close();
LoadXmlDoc.Save(XmlPath.Text);

6 个答案:

答案 0 :(得分:1)

尝试InputFromTxtFile.Trim()它将删除您正在阅读的文本文件中的任何延迟回车。

答案 1 :(得分:0)

这里没有确切答案...试用XmlDocument.PreserveWhitespace属性。考虑使用XmlTextWriter进行更多控制(可能)。顺便说一下,将StreamReader包裹在using块中,因为它是一次性的。

答案 2 :(得分:0)

在做了一些测试后,我发现了为什么会出现这种情况。我使用System.xml类创建对象。当我解析XML文件时,行为是它将正确的XML格式应用于我正在解析的XML文件。在这种情况下,以不期望的方式解释不包含值的节点。

例如,假设我有以下XML文档:

<root>

<record_1>
<name>Bob</name>
<employer>Microsoft</employer>
<start_date>September 9, 2009</start_date>
<end_date></end_date>
</record1>

<record_2>
<name>Bill</name>
<employer>Google</employer>
<start_date>November 2, 2004</start_date>
<end_date></end_date>
</record2>

</root>

当使用System.xml类时,它将格式化XML并将回车符插入<end_date></end_date>字段,使其变为:

<end_date>
</end_date>

这是一个问题,因为我正在编写此实用程序的程序在将回车应用于以前没有该格式的字段时将无法正确解释XML。我的解决方案是找到一种在事后删除回车的方法,或找到另一个不会出现这种行为的类或方法组。

答案 3 :(得分:0)

从您的描述中看来,如果您要设置一个空值,它意味着 InputFromTxtFile = sr.ReadLine()返回一个空字符串?这反过来意味着文本文件中的空行。如果是这样,请考虑使用 Regex.Replace(InputFromTxtFile,@“\ s”,“”),因为这将替换所有形式的空白区域,包括:空格,制表符,换行符和换行符。

答案 4 :(得分:0)

我今天用这个问题工作了几个小时,因为BizTalk 2006 R2解释了

<XmlElement>
</XmlElement>

作为回车换行符以及缩进的空格数。我终于发现了一种方法来使用有关preservewhitespace的信息rasx来提出这个解决方案。一个重要的注意事项是,在对象上执行保存或加载操作之前,preservewhitespace不会影响XmlDocument。对于我的例子,我有一个接收XmlDocument的方法,操纵它然后返回它:

public XmlDocument ManipulateIt (XmlDocument inDoc)
{
  //This statement will result in a start and end node with /r/n and spaces in the xmldoc
  inDoc["SomeNode"].InnerText = "";

  //Create a new doc and set the preservewhitespace attribute to true (important to do before calling LoadXml

  XmlDocument rtnDoc = new XmlDocument();
  rtnDoc.PreserveWhitespace = true;

  //When the OuterXml string is loaded into rtnDoc all extra whitespace is removed
  rtnDoc.LoadXml(inDoc.OuterXml);

  return(rtnDoc);
}

通过这样做,当inDoc被加载到rtnDoc时,所有额外的空格都从xml中删除,留下你:

<XmlElement></XmlElement>

我希望这有助于其他人使用以不同方式解析XML的产品。当两种产品都由同一家公司生产时,它会更加烦人。

(希望我在这篇文章中添加了足够的关键词来帮助下一个人找到它)

答案 5 :(得分:-1)

尝试以下方法:

SelectedNode.Value = !string.IsNullOrEmpty(InputFromTxtFile = sr.ReadLine()) ? InputFromTxtFile : null;

从我看到的问题发生时,你将空字符串分配给InnerText(BTW,为什么你使用InnerText?)