[c#] XML로 문자열 이스케이프

XML 요소의 내용을 채우는 데 사용할 수있는 문자열을 이스케이프 및 이스케이프 해제하는 데 사용할 수있는 C # 함수가 있습니까?

VSTS 2008 + C # + .Net 3.0을 사용하고 있습니다.

편집 1 : 나는 간단하고 짧은 XML 파일을 연결하고 내가 명시 적으로 예를 들어, 내가 둘 필요가 손으로 XML 문자를 이스케이프 할 필요가 그래서, 직렬화를 사용하지 않는 a<b으로 <foo></foo>내가 문자열을 벗어날 필요가 있으므로, a<b및 요소 foo는에 넣어.



답변

public static string XmlEscape(string unescaped)
{
    XmlDocument doc = new XmlDocument();
    XmlNode node = doc.CreateElement("root");
    node.InnerText = unescaped;
    return node.InnerXml;
}

public static string XmlUnescape(string escaped)
{
    XmlDocument doc = new XmlDocument();
    XmlNode node = doc.CreateElement("root");
    node.InnerXml = escaped;
    return node.InnerText;
}


답변


답변

편집 : “간단하고 짧은 XML 파일을 연결하고 있으며 직렬화를 사용하지 않으므로 명시 적으로 XML 문자를 직접 이스케이프해야합니다.”라고 말합니다.

손으로하지 말 것을 강력히 권합니다. XML API를 사용하여 모든 작업을 수행하십시오. 원본 파일을 읽고 필요에 따라 두 문서를 단일 문서로 병합 한 다음 (를 사용하고 싶을 것입니다 XmlDocument.ImportNode) 다시 작성하십시오. 자신 만의 XML 파서 / 포매터를 작성하고 싶지 않습니다. 여기서 직렬화는 다소 관련이 없습니다.

당신이하려는 일에 대한 짧지 만 완전한 예를 우리에게 줄 수 있다면, 우리는 아마 당신이 애초에 탈출에 대해 걱정할 필요가 없도록 도울 수있을 것입니다.


원래 답변

의미하는 바가 완전히 명확하지는 않지만 일반적으로 XML API가이를 수행합니다. 노드에 텍스트를 설정하면 필요한 모든 것을 자동으로 이스케이프 처리합니다. 예를 들면 :

LINQ to XML 예제 :

using System;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        XElement element = new XElement("tag",
                                        "Brackets & stuff <>");

        Console.WriteLine(element);
    }
}

DOM 예 :

using System;
using System.Xml;

class Test
{
    static void Main()
    {
        XmlDocument doc = new XmlDocument();
        XmlElement element = doc.CreateElement("tag");
        element.InnerText = "Brackets & stuff <>";
        Console.WriteLine(element.OuterXml);
    }
}

두 예의 출력 :

<tag>Brackets &amp; stuff &lt;&gt;</tag>

물론 XML 이스케이프를 원한다고 가정합니다. 그렇지 않은 경우 자세한 내용을 게시하십시오.


답변

한 줄 이스케이프에 대해 @sehe에게 감사드립니다.

var escaped = new System.Xml.Linq.XText(unescaped).ToString();

여기에 한 줄 탈출 해제를 추가합니다.

var unescapedAgain = System.Xml.XmlReader.Create(new StringReader("<r>" + escaped + "</r>")).ReadElementString();


답변

조지, 간단합니다. 항상 XML API를 사용하여 XML을 처리하십시오. 그들은 당신을 위해 모든 탈출 및 탈출을 수행합니다.

문자열을 추가하여 XML을 만들지 마십시오.


답변

예를 들어 XML 직렬화에서 읽을 때와 같이이 질문을 찾았을 때 저처럼 XML 노드 이름을 이스케이프하려면 가장 쉬운 방법을 사용하십시오.

XmlConvert.EncodeName(string nameToEscape)

또한 XML 요소에 대해 공백과 유효하지 않은 문자를 이스케이프합니다.

http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx


답변

태그를 반환하지 않는 John Skeet의 답변을 기반으로 한 또 다른 테이크 :

void Main()
{
    XmlString("Brackets & stuff <> and \"quotes\"").Dump();
}

public string XmlString(string text)
{
    return new XElement("t", text).LastNode.ToString();
}

그러면 전달 된 값만 XML 인코딩 형식으로 반환됩니다.

Brackets &amp; stuff &lt;&gt; and "quotes"