0

所以我有一个 XML 文档,我试图在 C# 中使用 XmlTextReader 导入,并且我的代码运行良好,除了一个部分,即标记行与实际文本/内容不在同一行,例如使用 product_name:

    <product> 
        <sku>27939</sku> 
        <product_name>
            Sof-Therm Warm-Up Jacket
        </product_name> 
        <supplier_number>ALNN1064</supplier_number> 
    </product>

我尝试对 XML 文档进行排序的代码如下:

while (reader.Read())
            {
                switch (reader.Name)
                {
                    case "sku":
                        newEle = new XMLElement();
                        newEle.SKU = reader.ReadString();
                        break;
                    case "product_name":
                        newEle.ProductName = reader.ReadString();
                        break;
                    case "supplier_number":
                        newEle.SupplierNumber = reader.ReadString();
                        products.Add(newEle);
                        break;
                }
            }

我已经尝试了几乎所有在 XmlTextReader 文档中找到的东西

reader.MoveToElement();
reader.MoveToContent();
reader.MoveToNextAttribute();

以及其他一些不太有意义的,但似乎没有一个能够始终如一地处理这个问题。显然我可以修复这个案例,但它会打破常规案例。所以我的问题是,在我找到“product_name”标签后,有没有办法让它转到包含文本的下一行并提取它?

我应该提到,之后我将它输出到 HTML 表中,并且元素出现空白,所以我相当确定它没有正确读取它。

提前致谢!

4

3 回答 3

2

我想你会发现 Linq To Xml 更容易使用

var xDoc = XDocument.Parse(xmlstring); //or XDocument.Load(filename);

int sku = (int)xDoc.Root.Element("sku");
string name = (string)xDoc.Root.Element("product_name");
string supplier = (string)xDoc.Root.Element("supplier_number");

您还可以将您的 xml 转换为字典

var dict = xDoc.Root.Elements()
           .ToDictionary(e => e.Name.LocalName, e => (string)e);

Console.WriteLine(dict["sku"]);
于 2013-05-09T13:40:55.940 回答
1

看起来您可能需要删除 XML 元素中文本前后的回车符、换行符、制表符和空格。在您的示例中,您有

    <!-- 1. Original example -->
    <product_name>
        Sof-Therm Warm-Up Jacket
    </product_name>

    <!-- 2. It should probably be. If possible correct the XML generator. -->
    <product_name>Sof-Therm Warm-Up Jacket</product_name>

    <!-- 3a. If white space is important, then preserve it -->
    <product_name xml:space='preserve'>
        Sof-Therm Warm-Up Jacket
    </product_name>

    <!-- 3b. If White space is important, use CDATA -->
    <product_name>!<[CDATA[
        Sof-Therm Warm-Up Jacket
    ]]></product_name>

XmlTextReader有一个WhitespaceHandling属性,但是当我测试它时,它仍然包括返回和缩进:

reader.WhitespaceHandling = WhitespaceHandling.None;

一种选择是在解析文档时使用一种方法来删除多余的字符。此方法删除字符串开头和结尾的正常空白:

string TrimCrLf(string value)
{
    return Regex.Replace(value, @"^[\r\n\t ]+|[\r\n\t ]+$", "");
}

    // Then in your loop...
    case "product_name":
       // Trim the contents of the 'product_name' element to remove extra returns
       newEle.ProductName = TrimCrLf(reader.ReadString());
       break;

您还可以将此方法 TrimCrLf() 与 Linq to Xml 和传统的 XmlDocument 一起使用。您甚至可以将其作为扩展方法:

public static class StringExtensions
{
    public static string TrimCrLf(this string value)
    {
        return Regex.Replace(value, @"^[\r\n\t ]+|[\r\n\t ]+$", "");
    }
}

// Use it like:
newEle.ProductName = reader.ReadString().TrimCrLf();

正则表达式解释:

  • ^ = 字段的开头
  • $ = 字段结束
  • []+= 匹配 1 个或多个包含的任何字符
  • \n= 回车 (0x0D / 13)
  • \r= 换行 (0x0A / 10)
  • \t=标签(0x09 / 9)
  • ' '= 空间 (0x20 / 32)
于 2013-05-09T14:18:14.923 回答
0

在处理源自 Mac 平台的文本时,由于换行符中的 \r\n 反转,我之前遇到过类似的问题。建议您尝试 Ryan 的正则表达式解决方案,但使用以下正则表达式:

         "^[\r\n]+|[\r\n]+$"
于 2013-05-09T14:26:54.553 回答