c# - 使用 XmlTextWriter 设置多个命名空间

标签 c# xml xml-namespaces infopath xmltextwriter

我正在尝试创建一个信息路径表单 XML 文件。我最初是在关注这个例子 programmatically-create-infopath-form-console-app但我遇到了多个 namespace 的问题。

这是我的信息路径表单 XML 文件中的一些命名空间

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:pc="http://schemas.microsoft.com/office/infopath/2007/PartnerControls" 
xmlns:dms="http://schemas.microsoft.com/office/2009/documentManagement/types"

在大多数情况下,当我按照示例进行操作时,一切都进行得很顺利,直到我阅读了 XML 文件的人员选择器部分。

我想要的:

<my:Updated_By>
    <pc:Person>
        <pc:DisplayName></pc:DisplayName>
        <pc:AccountId></pc:AccountId>
        <pc:AccountType></pc:AccountType>
    </pc:Person>
</my:Updated_By>

我做了什么(1):

        string myNamespace = "http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-09-02T01:11:44";
        ...
        writer.WriteStartElement("my", "myFields", myNamespace);
        writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
        writer.WriteAttributeString("xmlns", "pc", null, "http://schemas.microsoft.com/office/infopath/2007/PartnerControls");

        ...

        writer.WriteStartElement("my", "Updated_By", myNamespace);
        writer.WriteStartElement("pc", "Person");
        writer.WriteEndElement();
        writer.WriteStartElement("pc", "DisplayName");
        writer.WriteEndElement();
        writer.WriteStartElement("pc", "AccountId");
        writer.WriteEndElement();
        writer.WriteStartElement("pc", "AccountType");
        writer.WriteEndElement();
        writer.WriteEndElement();
        ...

我得到了什么(1):

<my:Updated_By>
    <pc xmlns="Person" />
    <pc xmlns="DisplayName" />
    <pc xmlns="AccountId" />
    <pc xmlns="AccountType" />
</my:Updated_By>

我不确定“xmlns=”是否对 XML 文件有任何影响,但我希望它看起来尽可能接近 infopath 生成的 XML 文件

解决这个问题的正确方法是什么?

最佳答案

我会使用 Xml Linq。请参阅下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string header = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +
                            "<my:Updated_By xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" +
                              " xmlns:pc=\"http://schemas.microsoft.com/office/infopath/2007/PartnerControls\"" +
                              " xmlns:dms=\"http://schemas.microsoft.com/office/2009/documentManagement/types\"" +
                              " xmlns:my=\"http://schemas.microsoft.com/office/infopath/2003/myXSD/2007-09-02T01:11:44\">" +
                            "</my:Updated_By>";
            XDocument doc = XDocument.Parse(header);
            XElement root = doc.Root;
            XNamespace pcNs = root.GetNamespaceOfPrefix("pc");

            string name = "John";
            string id = "123";
            string type = "person";

            root.Add(new XElement(pcNs + "Person",
                new XElement(pcNs + "DisplayName", name),
                new XElement(pcNs + "AccountId", id),
                new XElement(pcNs + "AccountType", type)
                ));

            doc.Save("filename");

        }
    }
}

关于c# - 使用 XmlTextWriter 设置多个命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50937307/

相关文章:

android - 在 Android 中从 res/xml 打开 XML 文件

c# - 如何为动态加载的方法设置超时

java - spring 中的 org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException

c# - Newtonsoft.json JSON.NET

xml - 列表应该如何用 XML 表示?

C# XPathSelectElement 和 xml with attribute xmlns ="http://www.w3.org/2000/09/xmldsig#"Help

svg - xmlstarlet:插入 svg 填充属性

c# - 为什么 'xmlns' 属性会影响 XPath 节点查找?

c# - LINQ 选择动态列和值

c# - 如何从嵌套在另一个泛型类中扩展我的类?