2010-07-14 4 views
1

Вот что мне нужно сделать: образец XML (не уверен, если он отображается прямо здесь)Удалить один узел/элемент из множества подобных узлов

<Tags> 
<Tag ID="0" UserTotal="1" AllowMultipleSelect="1"> 
    <Name>BaseSamples</Name> 
    <Sample ID="546" Count="1">Sample1 </Sample> 
    <Sample ID="135" Count="1">Sample99</Sample> 
    <Sample ID="544" Count="1">Sample2</Sample> 
    <Sample ID="5818" Count="1">Sample45</Sample> 
    </Tag> 
    </Tags> 

Я хочу удалить:

<Sample ID="135" Count="1">Sample99</Sample> 

и передать XML обратно, как:

<Tags> 
<Tag ID="0" UserTotal="1" AllowMultipleSelect="1"> 
    <Name>BaseSamples</Name> 
    <Sample ID="546" Count="1">Sample1 </Sample> 
    <Sample ID="544" Count="1">Sample2</Sample> 
    <Sample ID="5818" Count="1">Sample45</Sample> 
    </Tag> 
    </Tags> 

Любая помощь/советы будут оценены. Я буду знать атрибут входящего образца «ID», а также «SampleName» (элемент CDATA).

+0

Эми, пожалуйста, не ставьте строки, как «C#» в заголовке, если вы просто пытаетесь классифицировать ваш вопрос. Для этого нужны теги, и у вас уже есть тег C#. –

+0

спасибо за вход .. Это был первый раз, когда я пытался этот форум, так что вроде бы испортил его, я думаю! – Amy

ответ

2

Вы должны быть в состоянии сделать что-то подобное в C#

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load("XMLFile.xml");  
XmlNode node = xmlDoc.SelectSingleNode("/Tags/Tag/Sample[@ID='135']"); 
XmlNode parentNode = node.ParentNode; 
if (node != null) { 
    parentNode.RemoveChild(node); 
} 
xmlDoc.Save("NewXMLFileName.xml"); 
1

Выполнение этой таблицы стилей против XML даст желаемый ouptut:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes" /> 

    <!--identity template copies all content forward --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!--empty template will prevent this element from being copied forward--> 
    <xsl:template match="Sample[@ID='135']"/> 

</xsl:stylesheet> 
+0

Привет, Спасибо за ваш ответ. К сожалению, для этого мне нужно написать код C#. Есть ли способ использовать метод RemoveChild() для удаления этого узла? Я немного изучил, используя объект XmlNode вместе с методами removeChild() (при проверке на/Sample [@ ID = '135']). Не уверен, что я делаю неправильно. – Amy

+0

У вас может быть код C#, который вызывает XSLT ... Я не разработчик C#, поэтому я не могу предоставить точный фрагмент кода для использования RemoveChild(). Тем не менее, XPATH, который вы указали, является неправильным, и поэтому он не работает для вас. Это должно быть '/ Tags/Tag/Sample [@ ID = '135']'. –

1

Спасибо за ответ Мадс Хансен, это было очень полезно!!! Спасибо всем другим! Да, мой путь был неправильным. Ваш код работает, однако в моем случае выполнение 'save' вызывало ошибку. Я использовал ту же строку, чтобы сохранить информацию (а не файл newfile.xml, как вы упомянули в ответе примера). Возможно, что причиняло мне неприятности, вот что я сделал, чтобы решить эту новую проблему:

XmlDocument workingDocument = new XmlDocument(); 
workingDocument.LoadXml(sampleInfo); //sampleInfo comes in as a string. 
int SampleID = SampleID; //the SampleID comes in as an int. 

XmlNode currentNode; 
XmlNode parentNode; 
// workingDocument.RemoveChild(workingDocument.DocumentElement.SelectSingleNode("/Tags/Tag/Sample[@ID=SampleID]")); 
    if (workingDocument.DocumentElement.HasChildNodes) 
    {        
          //This won't work: currentNode = workingDocument.RemoveChild(workingDocument.SelectSingleNode("//Sample[@ID=" + SampleID + "]")); 
          currentNode = workingDocument.SelectSingleNode("Tags/Tag/Sample[@ID=" + SampleID + "]"); 
          parentNode = currentNode.ParentNode; 
          if (currentNode != null) 
          { 
           parentNode.RemoveChild(currentNode); 
          }        


       // workingDocument.Save(sampleInfo); 

          sampleInfo = workingDocument.InnerXml.ToString(); 
} 
Смежные вопросы