2012-06-28 31 views
1

如何从XML删除无有效字符,但保持标准 例如我想删除所有<和“从属性值内字符串XML清理(删除属性值无效字符)

<log> 
    <data id="1" name="No Error" value="0" /> 
    <data id="2" name="Error "1" between text" value="0" /> 
    <data id="3" name="Error <2> between text" value="0" /> 
</log> 

哪有我daynamicly除去引号包围的 “1” 和 <>包围2

该最终出放shuld是

<log> 
    <data id="1" name="No Error" value="0" /> 
    <data id="2" name="Error 1 between text" value="0" /> 
    <data id="3" name="Error 2 between text" value="0" /> 
</log> 

感谢suppot

我想以下解决方案:

  1. 读取文件为文本
  2. 修改与<Name=>开始,以 <value=>
  3. 删除所有",<,>结尾的任意字符串
  4. add " after <name=> and add "之前

如果这是正确的,我怎么能用C#做到这一点,替换方法将无法正常工作。

感谢

在PHP
+2

来自哪里的XML代码?这听起来像这样应该在Xml生成器中修复,而不是稍后再困惑。 –

+1

而不是试图解决这个无效的XML,你能修复编写XML的程序吗?它应该使用DOM或[XmlWriter](http://msdn.microsoft.com/en-us/library/system.xml.xmlwriter.aspx)来生成正确的xml。 – weston

+3

让我们把事情弄直。不要被愚蠢地认为你有XML作为输入。你所展示的与XML无关。你有一些随机的字符串字符。根据定义,XML意味着这些字符串的字符必须遵守某些规则。因此,要么修正生成该字符串的方式,以便它代表有效的XML,或者如果您无法控制此部分,请通知代码的作者,他有严重的错误需要修复。 –

回答

1

你的信息,我发现了两种不同的方式,

1-

public static void ReplaceInvalidCharFromAttribute(string filePath, string startElement, string nextElement, string[] removeStrings) 
     { 
      string tempFile = Path.GetTempFileName(); 

      using (var sr = new StreamReader(filePath)) 
      { 
       using (var sw = new StreamWriter(tempFile)) 
       { 
        string line; 
        string temp; 
        while ((line = sr.ReadLine()) != null) 
        { 
         temp = RemoveInvalidCharFromAttribute(line, startElement, nextElement, removeStrings); 
         sw.WriteLine(temp??line); 
        } 
       } 
      } 

      File.Delete(filePath); 
      File.Move(tempFile, filePath); 
     } 



public static string RemoveInvalidCharFromAttribute(string input, string startElement, string nextElement, string[] invalidChars) 
     { 
      if (input.IndexOf(startElement) < 0 || input.IndexOf(nextElement) < 0) return null; 
      int start =input.IndexOf(startElement) + startElement.Length; 
      int end = input.IndexOf(nextElement); 
      StringBuilder res = new StringBuilder(input.Substring(start, (end - start))); 
      StringBuilder resCopy = new StringBuilder(res.ToString()); 

      foreach (string inv in invalidChars) 
       res.Replace(inv, ""); 

      // return the result after surrounding the text with double 
      return 
       input.Replace(
       resCopy.ToString(), 
       (String.Concat("\"", String.Concat(res.ToString().Trim(), "\" ")))); 
     } 

2- http://support.microsoft.com/kb/316063

所以这么好,多亏

-1

我用下面的对数据进行编码,它进入XML之前: -

function xml_encode($string) 
{ 
    $string=preg_replace("/&/", "&amp;", $string); 
    $string=preg_replace("/</", "&lt;", $string); 
    $string=preg_replace("/>/", "&gt;", $string); 
    $string=preg_replace("/\"/", "&quot;", $string); 
    $string=preg_replace("/%/", "&#37;", $string); 

    return utf8_encode($string); 
} 

它看起来像你在浏览器中建议,直到你真正看来源。

此时您需要检查“& amp;”和十六进制/八进制码。

希望有所帮助。

+0

请注意,这也会破坏原始的Xml。 –

+2

-1错误的语言 - 但最重要的是根本没有任何帮助。 – weston

+0

我稍微改了一些例子来说明这样做是为了使XML有效。所以你需要删除ENCODED字符。 – Waygood