使用Xdocument的Xml阅读问题

时间:2016-11-16 04:10:57

标签: c# xml

以下是示例xml,

<?xml version="1.0" encoding="utf-8"?>
<UsersList>
  <User>
    <Name>sam&Tim</Name>
    <Address>21, bills street, CA</Address>
   <Issues>"Issues1", "Issues2"</Issues>
  </User> 
</UsersList> 

C#:

string xml = System.IO.File.ReadAllText(@"E:\Sample.xml"); 
                xml = System.Text.RegularExpressions.Regex.Replace(xml, "<(?![_:a-z][-._:a-z0-9]*\b[^<>]*>)", "&lt;");

                XDocument doc = XDocument.Parse(xml);

我需要转换特殊字符(&lt;,&gt;,“,”和&amp;),我正在使用上面的正则表达式。但是解析方法会抛出错误。任何帮助请如何解决问题

3 个答案:

答案 0 :(得分:0)

查看您当前的代码如此转换XML

&lt;?xml version="1.0" encoding="utf-8"?>
&lt;UsersList>
  &lt;User>
    &lt;Name>sam&Tim&lt;/Name>
    &lt;Address>21, bills street, CA&lt;/Address>
   &lt;Issues>"Issues1", "Issues2"&lt;/Issues>
  &lt;/User> 
&lt;/UsersList> 

而Parse看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<UsersList>
  <User>
    <Name>sam and Tim</Name>
    <Address>21, bills street, CA</Address>
   <Issues>"Issues1", "Issues2"</Issues>
  </User> 
</UsersList> 

因此您不应将<转换为&lt;,但XML包含sam&amp; Tim不允许您解析它。因此你可以使用

xml = xml.Replace("&", " n ");//n or and or some other char or string you want

而不是

xml = System.Text.RegularExpressions.Regex.Replace(xml, "<(?![_:a-z][-._:a-z0-9]*\b[^<>]*>)", "&lt;");

希望这可以帮助你解析它。

答案 1 :(得分:0)

您可以试试:

string xml = System.IO.File.ReadAllText(@"E:\Sample.xml"); 
xml = ReplaceXMLEncodedCharacters(xml)

public string ReplaceXMLEncodedCharacters(string input)
{
    const string pattern = @"&#(x?)([A-Fa-f0-9]+);";
    MatchCollection matches = Regex.Matches(input, pattern);
    int offset = 0;
    foreach (Match match in matches)
    {
        int charCode = 0;
        if (string.IsNullOrEmpty(match.Groups[1].Value))
            charCode = int.Parse(match.Groups[2].Value);
        else
            charCode = int.Parse(match.Groups[2].Value, System.Globalization.NumberStyles.HexNumber);
        char character = (char)charCode;
        input = input.Remove(match.Index - offset, match.Length).Insert(match.Index - offset, character.ToString());
    offset += match.Length - 1;
    }
    return input;
}

答案 2 :(得分:0)

您的问题是您的原始XML 不是有效的XML文档,因为它包含未转义的&符号(&#39;&amp;&#39;),{{{ 3}}说

  

&符号(&amp;)和左尖括号(&lt;)不得以字面形式出现,除非用作标记分隔符,或用于注释,处理指令或CDATA部分。

要使其有效,您必须使用&amp; amp而不是文字&amp ;.试图&#34;纠正&#34;在一般情况下,这是不实际的,也是一个完全糟糕的主意,因为你无法确定,在XML和代表文字和文字以及它是XML实体的一部分。如果可以明确地区分这些用法,那么该规则可以嵌入到XML解析器中,我们就不必处​​理它。

文档的有效,符合标准的表示形式

<?xml version="1.0" encoding="utf-8"?>
<UsersList>
  <User>
    <Name>sam&amp;Tim</Name>
    <Address>21, bills street, CA</Address>
   <Issues>"Issues1", "Issues2"</Issues>
  </User> 
</UsersList>