1

我有以下 XML 结构,它是 xml 文档的一部分:

<p:sp xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
....
....
....
<p:txBody>
 <a:bodyPr wrap="square" rtlCol="0" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:noAutofit />
 </a:bodyPr>
 <a:lstStyle xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" />
 <a:p xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
   <a:endParaRPr lang="en-US" sz="1200" dirty="0">
   <a:solidFill><a:schemeClr val="tx1" />
   </a:solidFill>
   <a:latin typeface="Verdana" pitchFamily="34" charset="0" />
   <a:ea typeface="Verdana" pitchFamily="34" charset="0" />
   <a:cs typeface="Verdana" pitchFamily="34" charset="0" /></a:endParaRPr>
 </a:p>
</p:txBody>
</p:sp>

我想选择p:txBody并想在最后注入a:p,我正在使用以下代码,但我收到的txBody不是正确的,因为我猜它是从 doc 对象中提取的,而不是从形状对象:

        XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
        nsmgr.AddNamespace("p", "http://schemas.openxmlformats.org/presentationml/2006/main");
        XmlNode txBody = shape.SelectSingleNode("//p:txBody", nsmgr);

其中shape是具有上述 OuterXml 的 XMLNode 对象,并使用以下代码进行 xml 注入:

        XmlDocumentFragment fragment = doc.CreateDocumentFragment();
        string xml = "valid xml";
        fragment.InnerXml = xml;
        txBody.Append(fragment);

但注射的形状不正确。

4

2 回答 2

0

如果 xpath 给您带来错误的节点,则您的 xpath 不够具体。您需要为其提供更多信息才能获得所需的节点。IE 是什么让您想要的节点与其他节点不同?

正如你现在所拥有的,你是说给我你找到的第一个节点,它在文件中的任何位置都有 p 命名空间和节点名称txBody

你有形状。但是//in"//p:txBody"说从文件的根目录开始。如果您的意思是从形状开始,请使用.//so like".//p:txBody"

于 2012-10-10T18:42:29.333 回答
0

使用 LINQ2XML。它完全替代了其他 XML API。

XElement doc=XElement.Load("yourXML.xml");
XNamespace p = "http://schemas.openxmlformats.org/presentationml/2006/main";
XNamespace s= "http://schemas.openxmlformats.org/drawingml/2006/main";

doc.Elements(p+"txBody").First().Add(new XElement(s+"tagName","value"));
于 2012-10-10T18:51:58.217 回答