1

我有一个 XML 文档。例如这个:

<Root xmlns:x="anynamespace" xmlns:html="htmlnamespace">
   <x:Data>bla bla</x:Data>
</Root>

在这里,我得到了 html 命名空间来格式化数据。但是元素的值可以是例如
<html:Font ...>bla bla</html:Font>
bla <html:Font ...>bla</htmk:Font>

在我的 C# 代码中,我这样做:
new XElement(main + "Data",myvalue); //main is namespace
结果,我得到<x:Data>&lt;html:Font ...&gt;bla bla etc.Linq 用它们的文本代码替换了关键标签。所以这是不可接受的。

然后我尝试了这个:new XElement(main + "Data",XElement.Parse(myvalue));
我得到了前缀 html 无法识别的异常。

有没有人遇到过这样的问题?你是怎么解决的?

4

1 回答 1

0

通常您不会从字符串构造内容,而是简单地使用 LINQ to XML 构造节点,例如

            XElement foo = XElement.Parse(@"<foo xmlns=""http://example.com/ns1"" xmlns:html=""http://example.com/html"">
  <bar>bar 1</bar>
</foo>");
            foo.Add(new XElement(foo.GetNamespaceOfPrefix("html") + "p", "Test"));

            Console.WriteLine(foo);

创建 XML

<foo xmlns="http://example.com/ns1" xmlns:html="http://example.com/html">
  <bar>bar 1</bar>
  <html:p>Test</html:p>
</foo>

如果您想解析作为字符串给出的片段,那么以下方法可能会有所帮助:

        public static void AddWithContext(this XElement element, string fragment)
        {
            XmlNameTable nt = new NameTable();
            XmlNamespaceManager mgr = new XmlNamespaceManager(nt);

            IDictionary<string, string> inScopeNamespaces = element.CreateNavigator().GetNamespacesInScope(XmlNamespaceScope.ExcludeXml);

            foreach (string prefix in inScopeNamespaces.Keys)
            {
                mgr.AddNamespace(prefix, inScopeNamespaces[prefix]);
            }

            using (XmlWriter xw = element.CreateWriter())
            {
                using (StringReader sr = new StringReader(fragment))
                {
                    using (XmlReader xr = XmlReader.Create(sr, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment }, new XmlParserContext(nt, mgr, xw.XmlLang, xw.XmlSpace)))
                    {
                        xw.WriteNode(xr, false);
                    }
                }
                xw.Close();
            }
        }
    }

    class Program
    {
        static void Main()
        {
            XElement foo = XElement.Parse(@"<foo xmlns=""http://example.com/ns1"" xmlns:html=""http://example.com/html"">
  <bar>bar 1</bar>
</foo>");
            foo.Add(new XElement(foo.GetNamespaceOfPrefix("html") + "p", "Test"));

            Console.WriteLine(foo);
            Console.WriteLine();

            foo.AddWithContext("<html:p>Test 2.</html:p><bar>bar 2</bar><html:b>Test 3.</html:b>");

            foo.Save(Console.Out, SaveOptions.OmitDuplicateNamespaces);

        }

这样我得到

<foo xmlns="http://example.com/ns1" xmlns:html="http://example.com/html">
  <bar>bar 1</bar>
  <html:p>Test</html:p>
  <html:p>Test 2.</html:p>
  <bar>bar 2</bar>
  <html:b>Test 3.</html:b>
</foo>
于 2012-07-30T12:30:57.673 回答