XML: как читать один файл в другой - PullRequest
2 голосов
/ 28 апреля 2011

У меня есть файл: A.xml, содержащий что-то вроде этого:

<?xml version="1.0"?>
<headernode>

</headernode>

Внутри headernode мне нужно иметь возможность динамически загружать содержимое другого XML-файла с именем B.xml, содержащего следующее

<?xml version="1.0"?>
<token>
<a>0</a>
</token>

Мой вопрос: как мне получить содержимое B.xml внутри узла заголовка a.xml?

Спасибо!

Ответы [ 6 ]

3 голосов
/ 28 апреля 2011

Это похоже на работу:

var header = XDocument.Load("a.xml");
var token = XElement.Load("b.xml");

var headerNode = header.Elements("headernode").First();
headerNode.Add(token);

Console.WriteLine(header.ToString()); 
/*
The above prints:

<headernode>
  <token>
    <a>0</a>
  </token>
</headernode>
*/
2 голосов
/ 28 апреля 2011

Это XQuery:

declare function local:copy-append($element as element()) {
   if ($element instance of element(headernode))
   then
      element headernode {$element/@*,doc('B.xml')}
   else
      element {node-name($element)}
         {$element/@*,
          for $child in $element/node()
          return if ($child instance of element())
                 then local:copy-append($child)
                 else $child
         }
};
local:copy-append(/*)

Вывод:

<headernode>
    <token>
        <a>0</a>
    </token>
</headernode>
2 голосов
/ 28 апреля 2011

Я предпочитаю некоторые другие ответы, но это было первое, что пришло в голову:

var a = new XmlDocument();
a.Load("c:\\a.xml");
var b = new XmlDocument();
b.Load("c:\\b.xml");
var node = a.SelectSingleNode("/headernode");
node.AppendChild(a.ImportNode(b.SelectSingleNode("/token"), true));
a.Save("c:\\c.xml"); 
2 голосов
/ 28 апреля 2011

Если вы можете использовать Linq to XML, это будет относительно просто:

XDocument doc1 = XDocument.Load("a.xml");
XDocument doc2 = XDocument.Load("b.xml");

doc1.Element("headernode").Add(doc2.Root);
0 голосов
/ 28 апреля 2011
//myXmlToInsert.xml
/*
<?xml version="1.0"?>
<root>
  <child1></child1>
  <child2></child2>
  <token>
      <a>0</a>
  </token>
</root>
*/

//code
XDocument xmlDoc = new XDocument();
xmlDoc.Declaration = new XDeclaration("1.0", "utf-8", "yes");
xmlDoc.Document.Add(new XElement("rootNode",new XElement("headerNode"), new XElement("bodyNode")));
XDocument xmlToInsert = XDocument.Load(@"c:\myXmlToInsert.xml");
XElement tokenNode = xmlToInsert.Root.Element("token");

xmlDoc.Root.Element("headerNode").Add(tokenNode);    

//Result 
/*
<?xml version="1.0"?>
<root>
  <headerNode>
    <token>
       <a>0</a>
    </token>
   </headerNode>
   <bodyNode>
   </bodyNode>
</root>
*/
0 голосов
/ 28 апреля 2011

Ну, я не знаю точного способа сделать это в C-Sharp, но в принципе не будет подход по умолчанию для

  1. загрузки DOM для A.xml
  2. найдите headernode
  3. загрузите B.xml в DOM
  4. разрешите корень DOM для B
  5. скопируйте корень из DOM B
  6. поместите его какпотомок к обнаруженному headernode DOM A
  7. переписать измененный DOM A в файл или куда вы хотите?

Поскольку я являюсь Java-разработчиком, я не очень знаком с C-Sharp XMLAPI, но в основном я видел там XMLDocument и XDocument.И когда я не ошибаюсь, XDocument новее и проще, но оба должны как-то это делать.

Помогает ли это?

...