我正在读取CSV文件并将其转换为XML。问题是,要点,连字符等。我试图替换"•"以及其他未被"视为"有效的字符。当生成XML时,子弹点表示为正方形,实际上,未识别的任何东西都是正方形。当我从生成的XML复制"正方形"时,所有"特殊"角色都被"视为"是一个带有问号的黑色钻石。在XML输出中,它表示为"�"。我尝试了:
int i = (int)'•';
Console.WriteLine(i);
我看到了8226的值。
所以我尝试用" html for bullet"替换u8226
,因此它将正确显示,但这行不通。
我以这种方式阅读了原始CSV:
string[] csvfile = File.ReadAllLines(inputFile).Skip(1).ToArray();
我正在阅读的文件不会很大,所以这就是为什么我正在阅读数组。
然后我在"上分开,给我转换为XML元素的列。如果我在Excel中打开文件并通过Excel手动进行替换,则无问题。我得到了预期的XML输出。我想以编程方式进行此操作。我没有任何问题在XML元素内使用常规文本进行替换,例如:
new XElement("elementName", columns[14].ToLower().Replace("yes", "1")
如果我尝试:
new XElement("elementName", columns[14].ToLower().Replace("•", "htmlReplacement")
什么都没有改变。
任何见解都会很棒!
这是我正在使用的代码:
//以下以下替换的正则表达式 - 这起作用
string inputFile = @"pathTo.csv";
string[] csvfile = File.ReadAllLines(inputFile).Skip(1).ToArray();
XNamespace xsi = XNamespace.Get("http://www.w3.org/2001/XMLSchema-instance");
XNamespace xsiNsl = XNamespace.Get("something.xsd");
XElement jobs = new XElement("Root",
new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
new XAttribute(xsi + "noNamespaceSchemaLocation", xsiNsl),
from line in csvfile
//let columns = line.Replace(", ", ", ").Replace(",0", ",0").Split(',')
let columns = Regex.Replace(Regex.Replace(Regex.Replace(Regex.Replace(line, dPat, rdPat), dPat2, rdPat2), dPat3, rdPat3), dPat4, rdPat4).Split(',')
select new XElement("item",
new XElement("column1", columns[0]),
new XElement("Column2", columns[1]),
new XElement("Column3", new XCData(columns[2].Replace("–", "-").Replace("•", "•").Replace("®", "®").Replace("©", "©"))),
new XElement("Column4", new XCData(columns[3].Replace("–", "-").Replace("•", "•").Replace("®", "®").Replace("©", "©"))),
new XElement("Column5", new XCData(columns[4].Replace("–", "-").Replace("x0095", "• ").Replace("®", "®").Replace("©", "©").Replace("nn", "").Replace(""", ""))),
new XElement("column6", columns[5]),
new XElement("column7", columns[6].Replace("/", "-")),
new XElement("column8", columns[7]),
new XElement("column 9", columns[8].Replace("$", "").Replace(" ", "").Replace(".00", "")),
new XElement("column10", columns[9]),
new XElement("column11", columns[10].Replace("/", "-")),
new XElement("column12", columns[11].Replace("/", "-")),
new XElement("column13", columns[12].ToLower().Replace("yes", "1").Replace("no", "0")),
new XElement("column14", columns[13].ToLower().Replace("yes", "1").Replace("no", "0")),
new XElement("column15", columns[14].ToLower().Replace("yes", "1").Replace("no", "0")),
new XElement("column16", columns[15].ToLower().Replace("yes", "1").Replace("no", "0")),
new XElement("column17", columns[16].ToLower().Replace("yes", "1").Replace("�", "0")),
new XElement("column18", columns[17]),
new XElement("column19", columns[18]),
new XElement("column20", columns[19])));
jobs.Save(@"outputPathFor.xml");
除了未替换的未识别字符外,创建的XML是预期的。我确实尝试使用十六进制,但也没有替换它们。
谢谢!
您可能需要确保从输入中逃脱Unicode字符的更通用方法(而不是进行string.Replace
调用)。就像下面的方法:
public static IEnumerable<string> UnicodeXmlEscape(IEnumerable<string> input)
{
var sb = new StringBuilder();
foreach (var line in input)
{
// Loop through each character in the line to see if it
// needs escaping.
for (int i = 0; i < line.Length; i++)
{
if (char.IsSurrogatePair(line, i))
// Escape in "�" format
sb.AppendFormat(@"&#x{0:x8}", char.ConvertToUtf32(line, i++)); // i++ to skip next one.
else
{
int ci = char.ConvertToUtf32(line, i);
if (ci > 127)
// Escape in "ꬒ" format
sb.AppendFormat(@"&#x{0:x4}", ci);
else // regular ASCII
sb.Append(line[i]);
}
}
yield return sb.ToString();
sb.Clear();
}
}
所以:
var escaped = UnicodeXmlEscape(new [] {
@"I'm trying to replace • along with other characters that are not being"
});
foreach (var line in escaped)
Console.WriteLine(line);
将产生下面的输出:
I'm trying to replace • along with other characters that are not being
请注意,某些Unicode字符在XML(http://www.w3.org/tr/tr/unicode-xml/)中不合法。上面的代码未检查其发生。
如何在代码中使用它
在您的代码中,您可以简单地使用它,以处理从输入文件中读取的每一行,并" XML Unicode Escape"。
var csvfile = UnicodeXmlEscape(File.ReadLines(inputFile).Skip(1)).ToArray();
要获得适当的逃逸线,您可以将其用作列分配的输入。
String.Replace