2012-06-13 95 views
1

我在這一個智能結束。這裏是我有的文件:將嵌套對象從一個XmlDocument複製到另一個

<?xml version="1.0"?> 
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Property1>TestObjectVal1</Property1> 
    <Property2>TestObjectVal2</Property2> 
    <Property3>TestObjectVal3</Property3> 
    <SubObject> 
    <Prop1>TestObject2Val1</Prop1> 
    <Prop2>TestObject2Val2</Prop2> 
    <Prop3>TestObject2Val3</Prop3> 
    </SubObject> 
</TestObject> 

我試圖將它的選定部分複製到基於某些指定XPath的新的XmlDocument對象。我嘗試過所有我能想到的排列方式。這就是我現在的位置。

var filters = new[] { "Property1", "Property2", "SubObject/Prop1" }; 

var xmlDoc = GetObjectXml(obj); //Loads the document 
var newDoc = (XmlDocument)xmlDoc.Clone(); 
newDoc.DocumentElement.RemoveAll(); 
var rootNode = xmlDoc.DocumentElement; 
foreach (var filter in filters) 
{ 
    var nodes = rootNode.SelectNodes(filter); 
    foreach (XmlNode node in nodes) 
    { 
     var newNode = newDoc.ImportNode(node, true); 
     newDoc.DocumentElement.AppendChild(newNode); 
    } 
} 

我正在找回是這樣的:

<?xml version="1.0"?> 
<TestObject> 
    <Property1>TestObjectVal1</Property1> 
    <Property2>TestObjectVal2</Property2> 
    <Prop1>TestObject2Val1</Prop1> 
</TestObject> 

但我想這一點:

<?xml version="1.0"?> 
<TestObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Property1>TestObjectVal1</Property1> 
    <Property2>TestObjectVal2</Property2> 
    <SubObject> 
    <Prop1>TestObject2Val1</Prop1> 
    </SubObject> 
</TestObject> 

任何想法,我做錯了嗎?

回答

0

它看起來像問題是,XPath的方法是選擇內部元素,從而使*子對象」的信息迷路,這個代碼會導致正確的輸出爲您具體的例子。

foreach (XmlNode node in nodes) 
{ 
    XmlElement newNode; 
    string[] xpathElements = filter.Split('/'); 
    if (xpathElement.Length == 2) 
    { 
     newNode = newDoc.CreateElement(filter); 
     newNode.AppendChild(newDoc.ImportNode(node, true)); 

    } 
    else 
    { 
     newNode = newDoc.ImportNode(node, true); 
    } 
    newDoc.DocumentElement.AppendChild(newNode); 
} 

請注意,此代碼對「過濾器」xpath表達式必須採用的形式進行了限制性假設......即,它必須是「RootElement」或「RootElement/ChildElement」形式(沒有屬性,最大深度爲三)。可能已經足夠,這取決於你的使用情況,但解決更一般的情況會更棘手...

相關問題