Вставка XML-элемента после последнего определенного узла / элемента - PullRequest
4 голосов
/ 22 января 2012

Я хочу добавить элементы после последнего дочернего элемента в XML.Но я получил ошибку.

<XML ID="Microsoft Search Thesaurus">
  <thesaurus xmlns="x-schema:tsSchema.xml">
    <diacritics_sensitive>0</diacritics_sensitive>
    <expansion>
        <sub>Internet Explorer</sub>
        <sub>IE</sub>
        <sub>IE5</sub>
    </expansion>
    <replacement>
        <pat>NT5</pat>
        <pat>W2K</pat>
        <sub>Windows 2000</sub>
    </replacement>
    <expansion>
        <sub>run</sub>
        <sub>jog</sub>
    </expansion>
    <expansion>
      <sub>home</sub>
      <sub>house</sub>
    </expansion>
  </thesaurus>
</XML>

Мой код указан ниже, и я сталкиваюсь с этой ошибкой при отладке кода.

Исключительная ситуация InvalidOperationException не обработана.

Последовательность не содержит элементов.

XDocument doc = XDocument.Load("tseng.xml");  //load the xml file.
IEnumerable<XElement> MemberList = doc.Element("XML").Elements("thesaurus");
var Member = new XElement("expansion",
                 new XElement("sub", "home"),
                 new XElement("sub", "house")
             );
MemberList.Last().AddAfterSelf(Member);  //add node to the last element.
doc.Save("tseng.xml");

Эта ошибка относится к конкретной строке:

MemberList.Last().AddAfterSelf(Member);

Я не знаю, в чем моя проблема с этим кодом.Как добавить элемент после последнего <expansion> узла в мой XML-файл?

Можете ли вы помочь мне в этой проблеме?Спасибо.

Ответы [ 2 ]

6 голосов
/ 22 января 2012

Элемент <thesaurus> имеет атрибут xmlns, который задает пространство имен, поэтому вам необходимо добавить пространство имен ко всем именам элементов.Кроме того, вы должны использовать Add вместо AddAfterSelf, если хотите, чтобы новый элемент <expansion> появлялся внутри <thesaurus> вместо него.

XNamespace ns = "x-schema:tsSchema.xml";
IEnumerable<XElement> MemberList = doc.Element("XML").Elements(ns + "thesaurus");
var Member = new XElement(ns + "expansion",
                 new XElement(ns + "sub", "home"),
                 new XElement(ns + "sub", "house"));
MemberList.Last().Add(Member);  //add node to the last element. 
0 голосов
/ 22 января 2012

Вам необходимо явно указать пространство имен для элемента thesaurus, так как оно отличается от пространства имен для корневого XML узла:

XNamespace ns = "x-schema:tsSchema.xml";
XDocument doc = XDocument.Load("tseng.xml");
IEnumerable<XElement> MemberList = doc.Element("XML").Elements(ns + "thesaurus");

Кроме того, имейте в виду, что ваш текущий код добавит новый expansion элемент после thesaurus один, а не его дочерние элементы.Если вы хотите добавить новый элемент expansion к последнему элементу thesaurus, используйте вместо этого следующий код:

var MemberList = root.Elements(ns + "thesaurus");
var Member = new XElement(ns + "expansion",
    new XElement(ns + "sub", "home"),
    new XElement(ns + "sub", "house")
);
MemberList.Last().Add(Member);

Это приведет к XML, аналогичному приведенному ниже примеру:

<XML ID="Microsoft Search Thesaurus">
  <thesaurus xmlns="x-schema:tsSchema.xml">
    <diacritics_sensitive>0</diacritics_sensitive>
    <!-- elided: new element goes here -->
    <expansion>
      <sub>home</sub>
      <sub>house</sub>
    </expansion>
  </thesaurus>
</XML>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...