C# 从一组类似节点中删除一个节点/元素

C# 从一组类似节点中删除一个节点/元素,c#,xml,removechild,C#,Xml,Removechild,以下是我需要做的: 示例XML(不确定是否显示在此处) 基本样品 样本1 样本99 样本2 样本45 我想删除: <Sample ID="135" Count="1">Sample99</Sample> Sample99 并将XML作为以下内容传递回: <Tags> <Tag ID="0" UserTotal="1" AllowMultipleSelect="1"> <Name>BaseSamples</Name&

以下是我需要做的: 示例XML(不确定是否显示在此处)


基本样品
样本1
样本99
样本2
样本45
我想删除:

<Sample ID="135" Count="1">Sample99</Sample>
Sample99
并将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>

基本样品
样本1
样本2
样本45

如有任何帮助/提示,将不胜感激。我将了解传入样本的“ID”属性以及“SampleName”(元素的CDATA)

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

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

您应该能够在C中执行类似的操作#


你应该能够在C中做类似的事情#


谢谢你的回答,非常有帮助!!! 也感谢所有其他人! 是的,我走错了路。 您的代码可以工作,但是在我的例子中,现在执行“保存”会导致错误。 我使用了相同的字符串来保存信息(不是一个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();
}

谢谢你的回答,非常有帮助!!! 也感谢所有其他人! 是的,我走错了路。 您的代码可以工作,但是在我的例子中,现在执行“保存”会导致错误。 我使用了相同的字符串来保存信息(不是一个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();
}

艾米,如果你只是想对你的问题进行分类,请不要在标题中加上“C”这样的字串。这就是标签的作用,你已经在问题上找到了C#标签。谢谢你的输入。。这是我第一次尝试这个论坛,所以我想我把它搞砸了!艾米,如果你只是想对你的问题进行分类,请不要在标题中加上“C”这样的字串。这就是标签的作用,你已经在问题上找到了C#标签。谢谢你的输入。。这是我第一次尝试这个论坛,所以我想我把它搞砸了!嗨,谢谢你的回答。不幸的是,我必须为此编写C#代码。是否有方法使用“RemoveChild()”方法删除此节点?我做了一些研究,使用XmlNode对象和removeChild()方法(同时检查/Sample[@ID='135'])。。不确定我做错了什么。您可以使用调用XSLT的C代码。。。我不是C#开发人员,因此无法提供使用RemoveChild()的确切代码片段。但是,您提供的XPATH不正确,这可能是它不适合您的原因。应该是
/Tags/Tag/Sample[@ID='135']
。您好,谢谢您的回答。不幸的是,我必须为此编写C#代码。是否有方法使用“RemoveChild()”方法删除此节点?我做了一些研究,使用XmlNode对象和removeChild()方法(同时检查/Sample[@ID='135'])。。不确定我做错了什么。您可以使用调用XSLT的C代码。。。我不是C#开发人员,因此无法提供使用RemoveChild()的确切代码片段。但是,您提供的XPATH不正确,这可能是它不适合您的原因。它应该是
/Tags/Tag/Sample[@ID='135']