我有两个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文档的新手,所以我想我会在这里要求节省时间。
谢谢,
百里
答案 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(又名XDocument
,XElement
和其他相关类)这实际上非常简单。在下面的代码中假设xmlA
和xmlB
是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:deductableCrossApply GetRecursiveList capturedNode Parent:overallDeductible GetRecursiveList NAME | VALUE:deductableCrossApply | NO
GetRecursiveList - capturedNode:yearType GetRecursiveList capturedNode Parent:overallDeductible GetRecursiveList NAME | VALUE:yearType | CALENDAR
GetRecursiveList - capturedNode:individual GetRecursiveList capturedNode Parent:inNetwork GetRecursiveList NAME | VALUE:个人| 0