macgyver700210 Ответов: 1

Добавление элементов, атрибутов к xmldocument застревает в цикле.


У меня есть странная проблема с .net framework 4, добавляющим что-либо к xml-документу.

У меня есть небольшой (35k) xml-файл, к которому я пытаюсь добавить комментарии. Раньше он работал нормально, но теперь, когда я пытаюсь добавить что-либо в файл, он застревает, когда я добавляю что-либо в xml-документ. Я могу редактировать комментарии без проблем.

Стек вызовов указывает на то, что он может иметь какое-то отношение к XmlElementListListener.OnListChanged. Я не знаю почему, потому что я не использую никаких xml-событий.

Спасибо за помощь.

 	mscorlib.dll!System.MulticastDelegate.RemoveImpl(System.Delegate value) + 0xaa bytes	
 	System.Xml.dll!System.Xml.XmlElementListListener.OnListChanged(object sender, System.Xml.XmlNodeChangedEventArgs args) + 0xe6 bytes	
 	System.Xml.dll!System.Xml.XmlNode.AfterEvent(System.Xml.XmlNodeChangedEventArgs args) + 0x27 bytes	
 	System.Xml.dll!System.Xml.XmlNamedNodeMap.AddNode(System.Xml.XmlNode node) + 0x104 bytes	
 	System.Xml.dll!System.Xml.XmlAttributeCollection.AddNode(System.Xml.XmlNode node) + 0x42 bytes	
 	System.Xml.dll!System.Xml.XmlAttributeCollection.Append(System.Xml.XmlAttribute node) + 0x96 bytes	
>	cmsoClashReports.dll!Camansol.Camansys.CMSGlobal.ClashReports.ClashComments.Add(Camansol.Camansys.CMSGlobal.ClashReports.Status _resultStatus) Line 322 + 0x34 bytes	C#



Это фрагмент xml:

<exchange xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" units="m" filename="" filepath="">
  <batchtest name="Report" internal_name="Report" units="m">
    <clashtests>
<!-- irrelevant data -->
    <summmary />
    <clashreults>
<clashresult name="Clash4" guid="0091a62c-fb5e-4aa7-82eb-0c5814d58bdc" href="Piping_files\cd000001.jpg" status="reviewed" distance="-0.004">
            <description>Hard</description>
            <resultstatus>Reviewed</resultstatus>
            <clashpoint>
              <pos3f x="25.960" y="19.206" z="4.018" />
            </clashpoint>
            <createddate>
              <date year="2016" month="5" day="2" hour="22" minute="45" second="52" />
            </createddate>
            <clashobjects />
            <comments> <!--  ATTEMPTING TO ADD NEW COMMENT TO THIS NODE -->
              <comment id="10000" status="new">
                <body>Replace Flanges</body>
                <user>usename</user>
                <createddate>
                  <date year="2016" month="5" day="9" hour="15" minute="0" second="26" />
                </createddate>
              </comment>
            </comments>
          </clashresult>
    </clashresults>
    </clashtests>
</batchtest>
</exchange>


Это код:
public void Add(Status _resultStatus)
        {
            int iNextID = 10000 + this.GetNextID; ;

            DateTime _dtComment = DateTime.Now;

            XmlDocument _xdClashReport = this.xmlClashComments.OwnerDocument;
            XmlElement _nodNewComment = _xdClashReport.CreateElement("comment");
            XmlElement _nodNewCommentUser = _xdClashReport.CreateElement("user");
            XmlElement _nodNewCommentBody = _xdClashReport.CreateElement("body");
            XmlElement _nodNewCommentCreatedDate = _xdClashReport.CreateElement("createddate");
            XmlElement _nodNewCommentDate = _xdClashReport.CreateElement("date");


            XmlAttribute _xatrNewCommentID = _xdClashReport.CreateAttribute("id");
            XmlAttribute _xatrNewCommentStatus = _xdClashReport.CreateAttribute("status");
            _nodNewComment.Attributes.Append(_xatrNewCommentID); //Application gets stuck here
            _nodNewComment.Attributes.Append(_xatrNewCommentStatus);
            _nodNewComment.SetAttribute("id", iNextID.ToString());
            _nodNewComment.SetAttribute("status", _resultStatus.ToString().ToLower());

            XmlAttribute _xatrNewCommentDateYear = _xdClashReport.CreateAttribute("year");
            XmlAttribute _xatrNewCommentDateMonth = _xdClashReport.CreateAttribute("month");
            XmlAttribute _xatrNewCommentDateDay = _xdClashReport.CreateAttribute("day");
            XmlAttribute _xatrNewCommentDateHour = _xdClashReport.CreateAttribute("hour");
            XmlAttribute _xatrNewCommentDateMinute = _xdClashReport.CreateAttribute("minute");
            XmlAttribute _xatrNewCommentDateSecond = _xdClashReport.CreateAttribute("second");


            _nodNewCommentDate.Attributes.Append(_xatrNewCommentDateYear);
            _nodNewCommentDate.Attributes.Append(_xatrNewCommentDateMonth);
            _nodNewCommentDate.Attributes.Append(_xatrNewCommentDateDay);
            _nodNewCommentDate.Attributes.Append(_xatrNewCommentDateMonth);
            _nodNewCommentDate.Attributes.Append(_xatrNewCommentDateHour);
            _nodNewCommentDate.Attributes.Append(_xatrNewCommentDateMonth);
            _nodNewCommentDate.Attributes.Append(_xatrNewCommentDateMinute);

            _nodNewCommentDate.SetAttribute("year", _dtComment.Year.ToString());
            _nodNewCommentDate.SetAttribute("month", _dtComment.Month.ToString());
            _nodNewCommentDate.SetAttribute("day", _dtComment.Day.ToString());
            _nodNewCommentDate.SetAttribute("hour", _dtComment.Hour.ToString());
            _nodNewCommentDate.SetAttribute("minute", _dtComment.Minute.ToString());
            _nodNewCommentDate.SetAttribute("second", _dtComment.Second.ToString());

            _nodNewCommentUser.InnerText = Environment.UserName;
            _nodNewCommentBody.InnerText = "New Comments";
            _nodNewCommentCreatedDate.AppendChild(_nodNewCommentDate);

            _nodNewComment.AppendChild(_nodNewCommentBody);
            _nodNewComment.AppendChild(_nodNewCommentUser);
            _nodNewComment.AppendChild(_nodNewCommentCreatedDate);

            this.xmlClashComments.AppendChild(_nodNewComment);

            ClashComment _newClashComment = new ClashComment();
            _newClashComment.xmlClashComment = _nodNewComment;

            this.List.Add(_newClashComment);


            if (OnClashCommentAdded != null)
            {
                OnClashCommentAdded(this, new ClashCommentsEventArgs());
            }
        }


Что я уже пробовал:

Попробовал создать новый проект
обновление до .net framework 4.5
возврат к предыдущей версии моего кода

1 Ответов

Рейтинг:
1

Patrice T

Цитата:
Стек вызовов указывает на то, что он может иметь какое-то отношение к XmlElementListListener.OnListChanged. Я не знаю почему, потому что я не использую никаких xml-событий.
Добавление к файлу-это ваш OnListChanged событие.

Если тот же код используется для работы, убедитесь,что XML-файл не поврежден.

И используйте отладчик, чтобы точно увидеть, когда и где возникнет проблема.

Отладчик позволяет вам следить за выполнением строка за строкой, проверять переменные, и вы увидите, что есть точка, в которой он перестает делать то, что вы ожидаете.
Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
Когда код не делает того, что ожидается, вы близки к ошибке.


macgyver700210

Спасибо за помощь. Отладка является неотъемлемой частью моего процесса программирования. Проблема в том, что у меня нет исходного кода для system.xml пространство имен. Если бы я это сделал, то, вероятно, смог бы все исправить.

Я склоняюсь к тому, что это жук. Я считаю, что это может иметь какое-то отношение к стороннему api, который я использую, потому что он работает так, как ожидалось в тестовом приложении, где я не ссылаюсь на этот api. (Я сделал это после этого поста). Я продолжу расследование, когда вернусь в офис во вторник. Спасибо снова