C # XMLWriter + предотвращение "/" "<" "<" символы - PullRequest
3 голосов
/ 11 июня 2010

У меня есть xmlWriter и я хочу написать строку, содержащую символы "/" "<" ">" (которые являются частью синтаксиса xml и нарушают код xml). Вот мой код c #:

public Boolean Initialize(String path)
    {
        Boolean result = true;

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.CheckCharacters = true;
            settings.Encoding = Encoding.UTF8;
            settings.Indent = true;

            xmlWriter = XmlWriter.Create(path, settings);

            xmlWriter.WriteStartDocument();
            xmlWriter.WriteStartElement("TestData");
            isInitialized = true;

        return result;
    }

public void WriteProducts(List<Product> productList)
    {
        if (isInitialized == true)
        {
            foreach (Product product in productList)
            {
                xmlWriter.WriteStartElement("Product");

                xmlWriter.WriteElementString("Id", product.ProdId);
                xmlWriter.WriteElementString("Name", product.ProdName);
                xmlWriter.WriteElementString("GroupId", product.ProdGroup);
                xmlWriter.WriteElementString("Price", product.ProdPrice.ToString((Consts.FORMATTED_PRICE)));

                xmlWriter.WriteEndElement();
            }
        }
    }

public void Close()
    {
        xmlWriter.WriteEndElement();
        xmlWriter.WriteEndDocument();
    }

Приложение работает без ошибок, но если я загляну в xml-файл, xml будет неполным, потому что xmlwriter прекращает запись узлов продукта, когда имя продукта содержит один из вышеупомянутых символов.

Есть ли способ решить эту проблему?

Ответы [ 4 ]

2 голосов
/ 11 июня 2010

Вы можете использовать WriteRaw или заключить содержимое в <![CDATA[ content goes here ]]>

1 голос
/ 11 июня 2010

Если, например, product.ProdName может содержать эти символы, вы можете сделать это:

xmlWriter.WriteStartElement("Product");

xmlWriter.WriteElementString("Id", product.ProdId);

xmlWriter.WriteStartElement("Name");
xmlWriter.WriteString(product.ProdName); // or xmlWriter.WriteCData(product.ProdName);
xmlWriter.WriteEndElement();

xmlWriter.WriteElementString("GroupId", product.ProdGroup);
xmlWriter.WriteElementString("Price", product.ProdPrice.ToString((Consts.FORMATTED_PRICE)));

xmlWriter.WriteEndElement();
0 голосов
/ 11 июня 2010

Вам нужно немного реорганизовать свой код и использовать WriteString для записи значений, поскольку это кодирует «специальные» символы:

использование http://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter.writestring.aspx

Когда Xmlчитать обратно (с помощью Xml-ридера) закодированные символы будут декодированы.

0 голосов
/ 11 июня 2010

Вы можете использовать метод Server.HtmlEncode(string) из класса System.Web.HttpServerUtility (для этого потребуется добавить сборку), который преобразует < в &lt; (например)

А затем используйте Server.HtmlDecode(string) для преобразования &lt; обратно в <

...