Анализ файла XML и замена выбранного узла значениями из текстового файла - PullRequest
0 голосов
/ 28 августа 2009

Я написал программу C # Winforms, которая берет файл XML и загружает значения из текстового файла в каждое вхождение того поля, которое пользователь указывает в пользовательском интерфейсе. По любой причине программа вставляет возврат каретки на любые узлы, которые не содержат значения. Например, он будет делать это с <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 ]

1 голос
/ 28 августа 2009

Попробуйте InputFromTxtFile.Trim() это избавит вас от каких-либо затяжных возвратов каретки в текстовом файле, в котором вы читаете.

0 голосов
/ 10 апреля 2010

Я работал с этой проблемой сегодня часами, потому что BizTalk 2006 R2 интерпретирует

<XmlElement>
</XmlElement>

как перевод строки каретки и сколько места для отступа. Я наконец-то нашел способ использовать информацию, предоставленную о 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, оставляя вам:

<XmlElement></XmlElement>

Я надеюсь, что это помогло кому-то еще работать с продуктами, которые по-разному анализируют XML. Немного раздражает, когда оба продукта производятся одной и той же компанией.

(Надеюсь, я добавил достаточно ключевых слов к этому сообщению, чтобы помочь следующему человеку найти его)

0 голосов
/ 17 сентября 2009

Из вашего описания кажется, что если вы собираетесь поставить пустое значение, это означает, что InputFromTxtFile = sr.ReadLine () вернул пустую строку? Что в свою очередь означает пустую строку в текстовом файле. Если это так, рассмотрите возможность использования Regex.Replace (InputFromTxtFile, @ "\ s", "") , поскольку это заменит все формы пробелов, включая: пробел, табуляцию, перевод строки и перевод строки.

0 голосов
/ 08 сентября 2009

После некоторого тестирования я обнаружил, почему это происходило. Я создавал объекты с использованием класса 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, когда возврат каретки применяется к полю как таковому, которое ранее не имело такого форматирования. Мое решение будет состоять в том, чтобы либо найти способ удалить возврат каретки после факта, либо найти другой класс или набор методов, которые не будут демонстрировать такое поведение.

0 голосов
/ 28 августа 2009

Попробуйте следующее:

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

Из того, что я вижу, проблема возникает, когда вы присваиваете InnerText пустую строку (кстати, почему вы используете InnerText?)

0 голосов
/ 28 августа 2009

Здесь нет точного ответа ... Поэкспериментируйте со свойством XmlDocument.PreserveWhitespace . Попробуйте использовать XmlTextWriter для большего контроля (возможно). Кроме того, кстати, оберните ваш StreamReader в using блок, потому что он одноразовый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...