Написание XML-полос завершает пробелы - PullRequest
1 голос
/ 10 февраля 2010

Я пытаюсь написать файл XML, используя MSXML4. Он работает нормально, за исключением случаев, когда у меня есть элемент данных с завершающим пробелом, который должен быть сохранен.

Учитывая следующий код для вставки нового элемента:

const _bstr_t k_Parent      (ToBSTR("ParentNode"));
const _bstr_t k_Child       (ToBSTR("ChildNode"));
const _bstr_t k_Data        (ToBSTR("DataWithTrailingSpace "));
const _bstr_t k_Namespace   (ToBSTR("TheNameSpace"));

MSXML2::IXMLDOMDocument2Ptr m_pXmlDoc;

m_pXmlDoc->async = VARIANT_FALSE;
m_pXmlDoc->validateOnParse = VARIANT_FALSE;
m_pXmlDoc->resolveExternals = VARIANT_FALSE;
m_pXmlDoc->preserveWhiteSpace = VARIANT_TRUE;

MSXML2::IXMLDOMNodePtr pElement = m_pXmlDoc->createNode(NODE_ELEMENT, k_Child, k_Namespace);
MSXML2::IXMLDOMNodePtr pParent = m_pXmlDoc->selectSingleNode(k_Parent);

pElement->put_text (k_Data);

MSXML2::IXMLDOMNodePtr pNewChild = pParent->appendChild(pElement);

Если я проверю «pNewChild-> text», текст все еще будет содержать завершающий пробел. Когда я пытаюсь записать его в файл:

std::string xml (static_cast<std::string>(m_pXmlDoc->xml));

std::ofstream file("output.xml");

file << xml << std::endl;

file.flush();
file.close();

Вывод:

<ParentNode>
    <ChildNode>DataWithTrailingSpace</ChildNode>
</ParentNode>

Вместо (обратите внимание на дополнительный пробел за «DataWithTrailingSpace»):

<ParentNode>
    <ChildNode>DataWithTrailingSpace </ChildNode>
</ParentNode>

Я не могу понять, в какой момент пространство в конце становится лишним.

Может ли кто-нибудь рассказать, где это может происходить, и как я могу это исправить?

Ответы [ 3 ]

1 голос
/ 10 февраля 2010

Если вам нужно сохранить пробелы, вы должны использовать раздел CDATA через createCDATASection() или тому подобное.

0 голосов
/ 11 февраля 2010

Тайна раскрыта. Не просматривайте ваш XML в Internet Explorer. Он скрывает висячие пробелы. Вместо этого используйте блокнот.

0 голосов
/ 10 февраля 2010

Вы должны заменить пробелы на &#xa0;. Таким образом, ваши пробелы должны сохраняться.

EDIT
По-видимому, это не решило твою проблему. Тогда, возможно, вы захотите взглянуть на эти сайты: http://msdn.microsoft.com/en-us/library/ms757008(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms757885(VS.85).aspx

...