Удаление элементов из xml - PullRequest
0 голосов
/ 01 октября 2018

Я сопоставляю в asp gridView элементы следующего xml:

<?xml version="1.0" encoding="utf-8"?>
<grammar xmlns="http://www.w3.org/2001/06/grammar" version="1.0" xml:lang="es-MX" mode="voice" tag-format="semantics/1.0" root="grmVoz">
  <rule id="grmVoz" scope="public">
    <ruleref uri="#rule1" />
    <tag>out.cxtag=rules.rule1;out.rule1=rules.rule1;</tag>
  </rule>
  <rule id="rule1">
    <tag>out='';</tag>
    <one-of>
      <item weight="1.0">Ivan Alberto<tag>out+="out1"</tag></item>
      <item weight="1.0">Ivan Alberto2<tag>out+="out2"</tag></item>
      <item weight="1.0">Ivan Alberto3<tag>out+="out3"</tag></item>
      <item weight="1.0">Ivan Alberto4<tag>out+="out4"</tag></item>
    </one-of>
  </rule>
</grammar>

Я пытаюсь удалить определенный элемент, когда нажимаю кнопку удаления в gridView.

это мой код:

protected void gvGrammars_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
 GridViewRow row = (GridViewRow)gvGrammars.Rows[e.RowIndex];
        string valor = row.Cells[0].Text;
        XDocument xdoc = XDocument.Load(Server.MapPath("voiceGrammar.grxml"));
     xdoc.Descendants("grammar").Elements("rule")
        .Where(x => (string)x.Attribute("id") == "rule1").Elements("one-of").Elements("item").Where(y=> (string)y.Value == valor)
        .Remove();
xdoc.Save(Server.MapPath("voiceGrammar.grxml"));
    }

, но ничего не произошло.

Я использовал вместо Desendant:

xdoc.Elements("grammar")

пожалуйста, проверьте, не пропустил ли я что-то.Заранее спасибо.

1 Ответ

0 голосов
/ 01 октября 2018

Попробуйте изменения ниже.При удалении элементов из списка вы должны удалить его из конца списка в начало, чтобы не пропустить элементы.Например, если у вас 4,5,6 и вы удалите 5. 6 становится 5, и вы пропускаете 6. Вы также пропустили пространство имен.

        protected void gvGrammars_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            GridViewRow row = (GridViewRow)gvGrammars.Rows[e.RowIndex];
            string valor = row.Cells[0].Text;
            XDocument xdoc = XDocument.Load(Server.MapPath("voiceGrammar.grxml"));
            XNamespace ns = xdoc.Root.GetDefaultNamespace();
            List<XElement> itemToDelete = xdoc.Descendants(ns + "rule")
               .Where(x => (string)x.Attribute("id") == "rule1").Select(y => y.Descendants(ns + "item").Where(z => z.FirstNode.ToString() == valor)).SelectMany(x => x).ToList();

            for (int i = itemToDelete.Count - 1; i >= 0; i--)
            {
                itemToDelete[i].Remove();
            }

            xdoc.Save(Server.MapPath("voiceGrammar.grxml"));
        }
...