我正在使用Linq to Xml来操作openXml文档。更确切地说,我正在尝试读取和写入文档自定义属性。我目前在向XElement添加前缀时遇到问题。我的代码如下:
Dim main as XNameSpace = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
Dim vt as XNameSpace = "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"
Dim props as XElement = cXDoc.Element(main + "Properties"
props.Add(New XElement(main + "property"), _
New XAttribute("fmtid", formatId), _
New XAttribute("pid", pid + 1), _
New XAttribute("name", "test"), _
New XElement(vt + "lpwstr", "test value")) _
)
添加前道具中包含的Xml是:
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes" />
props.add方法()调用后的Xml是:
<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
<property fmtid="{D5CDD505-2E9C-101B-9397-08002B2CF9AE}" pid="2" name="test">
<lpwstr xmlns="http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes">test value</lpwstr>
</property>
</Properties>
在属性元素中我应该
<vt:lpwstr>test value</vt:lpwstr>
但是不能让这件事发生。我也不希望这个元素的xmlns属性。我想我在某种程度上需要将映射vt XNameSpace返回到根元素“Properties”中的命名空间声明。有没有人有任何建议?
答案 0 :(得分:2)
在XElement中的某个位置,您需要定义前缀。以下是将vt
xmlns放在顶部的方法,将其添加为XAttribute:New XAttribute(XNamespace.Xmlns + "vt", "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes")
Dim main As XNamespace = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"
Dim vt As XNamespace = "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"
Dim formatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"
Dim pid = "2"
Dim props As New XElement(main + "Properties", New XAttribute(XNamespace.Xmlns + "vt", "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"))
props.Add(New XElement(main + "property"), _
New XAttribute("fmtid", formatId), _
New XAttribute("pid", pid + 1), _
New XAttribute("name", "test"), _
New XElement(vt + "lpwstr", "test value"))
XML Literals和全局命名空间可能更容易,但您仍需要在父级别的XML中列出vt
。这是一个XML Literals示例(记得将两个Imports语句放在类/模块的顶部,高于其他所有内容):
Imports <xmlns="http://schemas.openxmlformats.org/officeDocument/2006/custom-properties">
Imports <xmlns:vt="http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes">
Sub GetXml()
Dim formatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"
Dim pid = "2"
Dim props2 = <Properties>
<property fmtid=<%= formatId %> pid=<%= pid + 1 %> name="test">
<vt:lpwstr>test value</vt:lpwstr>
</property>
</Properties>
MsgBox(props2.ToString)
End Sub
答案 1 :(得分:1)
我发现控制名称空间声明位置的方法是使用Xml Literals。我还必须从头开始重新创建文档,并将旧文档中的任何现有信息复制到我新创建的文档中,这是不理想的。上面的示例中还有一个错误,足以在运行代码后使任何Office文档损坏。
Dim vt as XNameSpace = "http://schemas.openxmlformats.org/officeDocument2006/docPropsVTypes"
应该阅读
Dim vt as XNameSpace = "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"