Удалить один узел / элемент из набора похожих узлов - PullRequest
1 голос
/ 15 июля 2010

Вот что мне нужно сделать: образец 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>

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

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

Вы должны быть в состоянии сделать что-то подобное в 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 голос
/ 16 июля 2010

Спасибо за ответ, Мэдс Хансен, это было очень полезно !!! Спасибо всем остальным тоже! Да, мой путь был неправильным. Ваш код работает, однако в моем случае выполнение «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();
}
1 голос
/ 15 июля 2010

Выполнение этой таблицы стилей для XML даст желаемый результат:

<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>
...