【问题标题】:Parsing a XML File and Replacing Chosen Node With Values From Text File解析 XML 文件并用文本文件中的值替换所选节点
【发布时间】:2009-08-28 02:17:23
【问题描述】:

我编写了一个 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);

【问题讨论】:

    标签: c# xml winforms parsing text


    【解决方案1】:

    试试InputFromTxtFile.Trim(),它将消除您正在阅读的文本文件中任何挥之不去的回车。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在做了一些测试后,我发现了为什么会发生这种行为。我正在使用 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,并在&lt;end_date&gt;&lt;/end_date&gt;字段中插入回车,这样就变成了:

        <end_date>
        </end_date>
        

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

        【讨论】:

        • 有趣的是,当这实际上是应用程序中发生的事情时,我被标记了。
        • 他们可能将您标记为下线,因为这不是答案,只是有关问题的更多信息。
        【解决方案4】:

        从您的描述看来,如果您要输入一个空值,这意味着 InputFromTxtFile = sr.ReadLine() 返回了一个空字符串?这又意味着文本文件中的空行。如果是这样,请考虑使用 Regex.Replace(InputFromTxtFile, @"\s", ""),因为这将替换所有形式的空格,包括:空格、制表符、换行符和换行符。 p>

        【讨论】:

          【解决方案5】:

          我今天花了几个小时来解决这个问题,因为 BizTalk 2006 R2 解释了

          <XmlElement>
          </XmlElement>
          

          作为回车换行符以及缩进的多少个空格。我终于找到了一种方法,可以使用 rasx 提供的有关 preservewhitespace 的信息来提出这个解决方案。一个重要的注意事项是,在对象上执行保存或加载操作之前,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 中去除,留下:

          &lt;XmlElement&gt;&lt;/XmlElement&gt;

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

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

          【讨论】:

            【解决方案6】:

            尝试以下方法:

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

            据我所知,当您将空字符串分配给 InnerText 时会出现问题(顺便说一句,您为什么使用 InnerText?)

            【讨论】:

            • 我希望替换用户在 UI 上定义的每个节点实例的现有值。所以,我使用 InnerText 属性来选择这些值并将它们替换为文本文件中的值。
            猜你喜欢
            • 2013-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-03
            相关资源
            最近更新 更多