0

我有两个结构相同的 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 文档的新手,所以我想我会在这里询问以节省时间。

谢谢,

巴里

4

3 回答 3

0

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

于 2013-08-29T14:49:19.370 回答
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)然后创建一个额外的嵌套循环以更深入地深入到元素的其他级别。

于 2013-08-29T17:34:43.073 回答
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 - captureNode:hraPlan GetRecursiveList captureNode 父级:overallDeductible GetRecursiveList 名称|值:hraPlan | 是的

GetRecursiveList 捕获节点路径:createSbc/createSbcRequest/sbc/coreData/SBCDataContent/importantQuestions/overallDeductible/hraPlan

GetRecursiveList - captureNode: deductableCrossApply GetRecursiveList captureNode 父级:overallDeductible GetRecursiveList NAME|VALUE: deductableCrossApply | 不

GetRecursiveList 捕获节点路径:createSbc/createSbcRequest/sbc/coreData/SBCDataContent/importantQuestions/overallDeductible/deductableCrossApply

GetRecursiveList - captureNode:yearType GetRecursiveList captureNode 父:overallDeductible GetRecursiveList NAME|VALUE:yearType | 日历

GetRecursiveList 捕获节点路径:createSbc/createSbcRequest/sbc/coreData/SBCDataContent/importantQuestions/overallDeductible/yearType

GetRecursiveList - captureNode: individual GetRecursiveList captureNode Parent: inNetwork GetRecursiveList NAME|VALUE: individual | 0

GetRecursiveList 捕获节点路径:createSbc/createSbcRequest/sbc/coreData/SBCDataContent/importantQuestions/overallDeductible/inNetwork/individual

于 2013-08-30T13:56:47.057 回答