我有2个XML文档,结构相同。如果A中的值不同于B,则需要将其复制到B(或B的副本)

时间:2013-08-29 14:43:21

标签: c# xml

我有两个XML文档,结构相同。如果A中的元素值不同于B,则需要将其复制到B(或B的副本)。

澄清更新 :A中的元素值将是字符串“No Change”或其他内容,表示需要更新的值在B.这就是为什么我不能只复制整个文件。如果元素有“无变化”,我不会触及B中相同元素的任何值。如果除了“无变化”之外还有其他任何值,那么该值将被复制到B.换句话说,B是除非A中有更新的值,否则值仍然存在。

解决方案可以使用xmlDocument或XDocument,只要它有效,我就不是特别的了。我正在使用 framework 4.0 ,所以我猜XDocument是更现代的方法。

因此,对于我来说,我将遍历文档A的每个节点/元素,然后在B中查询相同的值并比较值,如果不同,则将A元素值复制到B中的相同元素(或B)的副本。

我是 C#中查询XML文档的新手,所以我想我会在这里要求节省时间。

谢谢,

百里

3 个答案:

答案 0 :(得分:0)

http://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5?SRC=VSIDE您可以通过此工具将基本XML文件转换为另一个 @edit:和一些不错的文档:http://msdn.microsoft.com/en-us/library/dd465326.aspx

答案 1 :(得分:0)

使用LINQ to XML(又名XDocumentXElement和其他相关类)这实际上非常简单。在下面的代码中假设xmlAxmlB是XDocument的两个实例,它们分别从xml文档A和xml文档B加载了您的数据:

string dataA = xmlA.Element("ROOT_ELEMENT").Element("Element1").Value;
if(!dataA.equals("No Change"))
    xmlB.Element("ROOT_ELEMENT").Element("Element1").Value = dataA;

这将检查名为Element1的元素中的值,无论你的根元素被命名的是什么,都没有值“No Change”。如果为true,这将更新文档B中匹配元素中的值。

编辑:添加一个额外的例子来遍历整个文档并为每个元素执行此操作:

XElement rootElementA = xmlA.Element("ROOT_ELEMENT");
XElement rootElementB = xmlB.Element("ROOT_ELEMENT");
foreach(XElement element in rootElementA.Elements())
{
    if(!element.Value.Equals("No Change"))
    {    
        XElement e = 
               (from el in rootElementB.Elements() 
               where element.Name == el.Name 
               select el).FirstOrDefault();
         e.Value = element.Value;
     }
 }

请记住一些事情。上面的例子假设只有两个级别的元素,根元素,然后是所有元素。如果您的XML更深入,您将需要对循环中找到的各个元素使用HasElements属性(即:if(element.HasElements),然后创建一个额外的嵌套循环,以深入深入了解其他级别的元素。

答案 2 :(得分:0)

根据JNYRanger的建议,我昨晚想出了这个:

TraverseNodes(xmlSbcCoreData.ChildNodes);

传入我的XmlDocument对象......

    private void TraverseNodes(XmlNodeList nodes) {

        Boolean haveValue = false;

        foreach (XmlNode node in nodes) {
            // Do something with the node.

            if (!node.Name.Equals("#text")) {
                nodeName = node.Name;
                capturedNode = node;
                haveValue = false;
            } else {
                nodeValue = node.Value;
                haveValue = true;
            }

            if (haveValue) {
                Debug.WriteLine("-----------------------------------------------------");
                Debug.WriteLine("GetRecursiveList - capturedNode: " + capturedNode.Name);
                Debug.WriteLine("GetRecursiveList capturedNode Parent: " + capturedNode.ParentNode.Name);
                Debug.WriteLine("GetRecursiveList NAME|VALUE: " + nodeName + " | " + nodeValue);

                string path = getNodePath(capturedNode);
                Debug.WriteLine("GetRecursiveList capturedNode PATH: " + path);

                //THIS IS HOW YOU GET THE NODE IN THE OTHER XML
                XElement element = xmlNbidData.XPathSelectElement(path);
                //AND THEN SET ITS VALUE !!!
                element.Value = nodeValue;
            }

            TraverseNodes(node.ChildNodes);
        }

    }

这是运行时(样本):


GetRecursiveList - capturedNode:hraPlan GetRecursiveList capturedNode Parent:overallDeductible GetRecursiveList NAME | VALUE:hraPlan |是

GetRecursiveList capturedNode PATH:createSbc / createSbcRequest / sbc / coreData / SBCDataContent / importantQuestions / overallDeductible / hraPlan

GetRecursiveList - capturedNode:deductableCrossApply GetRecursiveList capturedNode Parent:overallDeductible GetRecursiveList NAME | VALUE:deductableCrossApply | NO

GetRecursiveList capturedNode PATH:createSbc / createSbcRequest / sbc / coreData / SBCDataContent / importantQuestions / overallDeductible / deductableCrossApply

GetRecursiveList - capturedNode:yearType GetRecursiveList capturedNode Parent:overallDeductible GetRecursiveList NAME | VALUE:yearType | CALENDAR

GetRecursiveList capturedNode PATH:createSbc / createSbcRequest / sbc / coreData / SBCDataContent / importantQuestions / overallDeductible / yearType

GetRecursiveList - capturedNode:individual GetRecursiveList capturedNode Parent:inNetwork GetRecursiveList NAME | VALUE:个人| 0

GetRecursiveList capturedNode PATH:createSbc / createSbcRequest / sbc / coreData / SBCDataContent / importantQuestions / overallDeductible / inNetwork / individual