2010-02-10 3 views
1

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

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

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-> текст», текст по-прежнему содержит замыкающий пробел. Когда я пытаюсь писать в файл:

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> 

Я не могу понять в какой точке конечное пространство становится разделенным.

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

ответ

0

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

0

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

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

+0

Я не могу заставить это работать. Я в конечном итоге с: DataWithTrailingSpace   Пространство есть, между данными и « ». – TERACytE

1

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

+0

Хотя это сохраняет пространство, он также вводит « DataWithTrailingSpace». – TERACytE

+0

Тогда ваша система приема __ не поддерживает XML__. В XML « DataWithTrailingSpace» является _exactly_ таким же, как «" – MSalters