1

私はこれで頭がいっぱいです。私が持っている文書は次のとおりです。

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

私が間違っていることは何か分かりますか?

4

1 に答える 1

0

xpath メソッドが内部要素を選択しているため、*SubObject" 情報が失われていることが問題のようです。このコードは、特定の例に対して正しい出力をもたらすはずです。

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」の形式でなければなりません (属性なし、最大深さ 3)。ユースケースによってはそれで十分かもしれませんが、より一般的なケースを解決するにはもう少し注意が必要です...

于 2012-06-13T02:46:02.873 に答える