【问题标题】:XML Manipulation and InjectionXML 操作和注入
【发布时间】:2012-10-10 18:00:31
【问题描述】:

我有以下 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 对象而不是 shape 对象中提取的:

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

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

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

但是注射的形状不正确。

【问题讨论】:

    标签: c# .net xml xml-parsing


    【解决方案1】:

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

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

    您有 shape.,但 "//p:txBody" 中的 // 表示从文件的根目录开始。如果您打算从形状开始,请使用 .// 就像 ".//p:txBody"

    【讨论】:

      【解决方案2】:

      使用 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"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-25
        • 2018-10-30
        • 1970-01-01
        • 2013-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多