在使用QIODevice::write方法时,如何添加" 
 "代替回车?

4
为了替换XML文件的一部分,我使用QDomNode类来:

  • 在现有节点之前插入节点
  • 删除节点

但是当我这样做时,结果很糟糕:我添加的每个节点的每行结尾都带有 字符。

<?xml version='1.0'?>
  <scene>
    <material>
      <uid>50000006</uid>
      <name>NEW_NODE</name>&#xd;
                            /&#xd;
                          .7&#xd;
               \       , //&#xd;
               |\.--._/|//&#xd;
              /\ ) ) ).'/&#xd;
             /(  \  // /&#xd;
            /(   J`((_/ \&#xd;
           / ) | _\     /&#xd;
          /|)  \  eJ    L&#xd;
         |  \ L \   L   L&#xd;
        /  \  J  `. J   L&#xd;
        |  )   L   \/   \&#xd;
       /  \    J   (\   /&#xd;
       |  \      \   \```&#xd;
   </material>
</scene>

我希望知道如何在每行结尾不插入这些字符的情况下插入节点。

以下是我插入XML文件中新数据的方法:

// ADD A NEW DATA
void ParserIGS::addNewElement(QDomElement element, QDomElement oldElement)
{
  // Insert the new element before the old one
  oldElement.parentNode().insertBefore(element,oldElement);

  // Verify if the new material had an UID child
  QDomNodeList elementNodeList = element.elementsByTagName("uid");
  QDomNode n = oldElement.elementsByTagName("uid").at(0);
  if(elementNodeList.isEmpty()) // Creation of uid tag as firstChild
    element.insertBefore(n, element.firstChild());
  else
    element.replaceChild(n, element.firstChild());
}

1
我认为问题在于seq ' '是由默认的**toString()**方法创建的。因此,您需要手动进行替换,例如:doc_text.replace(" ", "")。 链接:https://code.google.com/r/pmarinc-tidylib/source/browse/src/Sigil/BookManipulation/XHTMLDoc.cpp?r=57851ba5653f4662fafe6af952265b540c6e16b6 - Vladimir Bershov
1
“使用QIODevice::write()…” - 你在哪里使用QIODevice::write()?原始文件是什么样子的?你实际插入了哪些节点内容?你想保留CR吗?如果是,为什么?如果空格和换行符很重要,你应该使用xml:space=“preserve”。 - Frank Osterfeld
1
你应该提供创建新元素的代码,其中包括创建新元素中字符串的添加方法以及如何输出我们在这里看到的字符串。你提供的代码不应该导致发生这种情况。 - Teimpz
1
你找到任何解决方案了吗?我也有同样的问题。有趣的是:在我的情况下,只有在开头标签(<name>)和值之后,这个字符串才会出现。 - Makuna
我使用insertAfter时遇到了相似的问题。特殊序列&#xd;被添加(不总是),但在某些行中...我甚至看不出为什么选择了这些行... - salvolds
特殊序列 &#xd; 会在包含 textNode 值的行末添加,该值带有一些空格或制表符...例如: <span class="InfoSuppTop_intestazione_eng">&#xd; Information&#xd; </span> - salvolds
1个回答

0

我曾经使用insertAfter插入一个包含空格的textNode时遇到了类似的问题。
事实上,XML认为四个字符是空格:回车符(\r或ch(13))、换行符(\n或ch(10))、制表符(\t或ch(9))和空格键(' '或ch(32))。
在XML中,字符可以被编码为实体,使用&#...(类似于html),特别是对于这样的十六进制数字格式的实体:

&#x Hexadecimal number ;

由于某些原因,toString() 方法将回车编码为 XML 十六进制实体 &#xd;,从正式的角度来看这是正确的。
因此,如果您要插入带有空格的文本节点,您只需要创建没有空格的元素,然后您可以使用 AddNewElement,最后您将看到没有出现 &#xd;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接