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

通常、文字列からコンテンツを構築するのではなく、LINQtoXMLを使用してノードを構築するだけです。

            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 に答える