XElement上的XPath列表



我正在尝试获取C#-中第一个xpath匹配的值

private string getValue(List<string> xpaths, XElement xml) {
string stringValue = string.Empty;
foreach(string xpath in xPaths)
{
var value = xml.XPathEvaluate(xpath);
if (value is IEnumerable)
{
foreach (XObject xObject in value)
{
if (xObject is XElement)
{
stringValue = ((XElement)xObject).Value.FirstOrDefault().ToString();
break;
}
else if (xObject is XAttribute)
{
stringValue = ((XAttribute)xObject).Value.FirstOrDefault().ToString();
break;
}
}
}
else
stringValue = value.ToString();
}
return stringValue;
}

我的列表将如下所示-

//Request/Header/Error/text()    
//Request/Header/Error[0]/Details/ErrorMesage/text()
//Request/Header/Error/Details/@code
//Request/Header/Error/Details/StackTrace/text()

在XPaths列表中,我想遍历该列表并返回第一个匹配项。XPathEvaluate对我不起作用。我不确定出了什么问题。

可能的XML值

<Request>
<Header>
<Error>
<Details>
<StackTrace>trace</StackTrace>
</Details>
<Error>
</Header>
</Request>

<Request>
<Header>
<Error>
<Details>
<ErrorMessage>This is the Error Message1.</ErrorMessage>
</Details>
<Error>
<Error>
<Details>
<ErrorMessage>This is the Error Message2.</ErrorMessage>
</Details>
<Error>
</Header>
</Request>
<Request>
<Header>
<Error>This is the error message.<Error>
</Header>
</Request>
<Request>
<Header>
<Error>
<Details code="123">
<StackTrace>trace</StackTrace>
</Details>
<Error>
</Header>
</Request>
<Request>
<Header>
<Error>
<Details>
<ErrorMessage>This is the Error Message.</ErrorMessage>
</Details>
<Error>
</Header>
</Request>

这被传递给这样的方法-

getValue(xpathList, XElement.Parse(xmlString))

由于我不知道会得到什么xml,所以我想循环浏览XPath列表并返回第一个匹配项。它可以是元素文本,也可以是属性值。

首先,我们使用XDocument,您可以使用XElement,但您需要更改xpathListXPath表达式,更多详细信息:
1-您在所有xml测试用例中都有错误,Error标签未关闭,然后更正它们:

<Request>
<Header>
<Error>
<Details>
<StackTrace>trace</StackTrace>
</Details>
</Error>
</Header>
</Request>

2-您在这个表达式CCD_ 6中有一个错误,要获得第一个Error,请使用1而不是0,在ErrorMesage:中也会错过s

List<string> xPathList = new List<string>
{
"//Request/Header/Error/text()",
"//Request/Header/Error[1]/Details/ErrorMessage/text()",
"//Request/Header/Error/Details/@code",
"//Request/Header/Error/Details/StackTrace/text()"
};

3-更改GetValue,如以下代码:

private string GetValue(List<string> xPaths, XDocument xml)
{
string stringValue = string.Empty;
foreach (string xpath in xPaths)
{
var value = xml.XPathEvaluate(xpath);
foreach (XObject xObject in (IEnumerable)value)
{
if (xObject is XElement)
{
return ((XElement)xObject).Value;
}
else if (xObject is XAttribute)
{
return ((XAttribute)xObject).Value;
}
else
{
return ((XText)xObject).Value;
}
}
}
return stringValue;
}

4-测试

string result = GetValue(xPathList, XDocument.Parse(xmlString));

5-演示

string xml1 = @"<Request>
<Header>
<Error>
<Details>
<StackTrace>trace</StackTrace>
</Details>
</Error>
</Header>
</Request>";
string xml2 = @"<Request>
<Header>
<Error>
<Details>
<ErrorMessage>This is the Error Message1.</ErrorMessage>
</Details>
</Error>
<Error>
<Details>
<ErrorMessage>This is the Error Message2.</ErrorMessage>
</Details>
</Error>
</Header>
</Request>";
string xml3 = @"<Request>
<Header>
<Error>This is the error message.</Error>
</Header>
</Request>";
string xml4 = @"<Request>
<Header>
<Error>
<Details code=""123"">
<StackTrace>trace</StackTrace>
</Details>
</Error>
</Header>
</Request>";
string xml5 = @"<Request>
<Header>
<Error>
<Details>
<ErrorMessage>This is the Error Message.</ErrorMessage>
</Details>
</Error>
</Header>
</Request>";
List<string> xPathList = new List<string>
{
"//Request/Header/Error/text()",
"//Request/Header/Error[1]/Details/ErrorMessage/text()",
"//Request/Header/Error/Details/@code",
"//Request/Header/Error/Details/StackTrace/text()"
};
string result1 = GetValue(xPathList, XDocument.Parse(xml1));
Console.WriteLine($"xml1 : {result1}");
string result2 = GetValue(xPathList, XDocument.Parse(xml2));
Console.WriteLine($"xml2 : {result2}");
string result3 = GetValue(xPathList, XDocument.Parse(xml3));
Console.WriteLine($"xml3 : {result3}");
string result4 = GetValue(xPathList, XDocument.Parse(xml4));
Console.WriteLine($"xml4 : {result4}");
string result5 = GetValue(xPathList, XDocument.Parse(xml5));
Console.WriteLine($"xml5 : {result5}");

6-结果

xml1 : trace
xml2 : This is the Error Message1.
xml3 : This is the error message.
xml4 : 123
xml5 : This is the Error Message.

我希望这能帮助

最新更新