2012-07-30 2 views
1

XML 문서가 있습니다. 예를 들면 다음과 같습니다.Linq to XML XElement 알 수없는 네임 스페이스를 구문 분석합니다.

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

여기에 데이터 서식 지정을 위해 html 네임 스페이스가 있습니다. 요소의 BUT 값은 예를 들어 내가 Linq에 자신의 텍스트 코드와 키 태그를 대체 <x:Data>&lt;html:Font ...&gt;bla bla etc.있어 그 결과
new XElement(main + "Data",myvalue); //main is namespace
: 내 C# 코드에서 bla <html:Font ...>bla</htmk:Font>


<html:Font ...>bla bla</html:Font> 또는
나는이 작업을 수행. 따라서 이것은 받아 들일 수없는 것입니다.

그럼 내가 시도 : new XElement(main + "Data",XElement.Parse(myvalue));
거기 접두사 html을 인정하지 않는 예외가있어.

누구나 그런 문제에 직면 해 있습니까? 어떻게 그걸 해결 했니?

+0

네임 스페이스 또는 encodin에 관한 문제가 있습니까? g HTML? –

+0

@Henk Holterman, 제 문제는 ... 일부 필드의 SQL 테이블에 html 서식이 있어야합니다. 하지만 그럴 수도 있고 그렇지 않을 수도 있습니다. 그래서 나는 "xml injection"과 같은 일을하고 싶습니다. – StNickolas

+0

오른쪽. XElement.Parse()가 첨부되기 전에 XDoc에서 네임 스페이스를 가져올 방법이 없습니다. –

답변

0

일반적으로 문자열로 내용을 구성하지 않고 LINQ to XML을 사용하여 간단하게 노드를 구성합니다.

 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> 
을 얻을 방법을 : 당신은 문자열로 주어진 조각을 구문 분석하려면
  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> 

를 생성

+0

hm..thanks, 도움이됩니다.) – StNickolas

관련 문제